• 1的数目编程之美132


    给定一个十进制数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有'1'的个数
    比如:
    N=2,写下1,2,这样只出现了1个'1'
    N=12,我们写下1,2,3,4,5,6,7,8,9,10,11,12,这样1的个数5
    写一个函数f(N),返回1到N之间'1'出现的个数,比如f(12)=5;

    以下是作者给的算法

    作者的算法
    ull Sum1s(ull n)
    {
    ull cnt =0;
    ull factor=1;
    ull low = 0;
    ull high = 0;
    ull cur =0;
    while(n/factor != 0)
    {
    low = n -(n/factor)*factor;
    cur = (n/factor)%10;
    high = n/(factor*10);
    switch(cur)
    {
    case 0:
    {
    cnt += high * factor;
    }
    break;
    case 1:
    {
    cnt += high * factor + low +1;
    }
    break;
    default:
    cnt += (high+1)*factor;
    }
    factor*=10;
    }
    return cnt;
    }

    下面是我的算法,我的算法不单单是能求出1的个数,还可以求出其他数字的个数,比如说7,只需要让num=7即可

     我的算法
    typedef unsigned long long ull;
    ull SumNs(ull N,ull num =1)
    {
    ull sum = 0;
    ull factor = 1;
    ull rest =0;
    while(N!=0)
    {
    ull r = N%10;
    N/=10;
    sum += factor * N;
    if(r>num)
    {
    sum +=factor;
    }
    else if(r==num)
    {
    sum+=rest+1;
    }
    rest += r*factor;
    factor*=10;
    }
    return sum;
    }


    以下是验证代码

    验证代码
    int main()
    {

    for(ull i =0;i<10000000;++i)
    {
    if(Sum1s(i)!=SumNs(i))
    cout<<Sum1s(i)<<" "<< SumNs(i)<<endl;
    }
    }



  • 相关阅读:
    我的DBDA类文件
    登录时的验证码怎么写?
    phpcms 制作简单企业站的常用标签
    HTML 基础知识
    目标
    split函数的实现
    myString操作符重载
    cout中的执行顺序_a++和++a
    二叉树的层次遍历法
    树的前中序遍历_求后续遍历
  • 原文地址:https://www.cnblogs.com/SammyLan/p/2220718.html
Copyright © 2020-2023  润新知