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;
}
}



原文地址:https://www.cnblogs.com/SammyLan/p/2220718.html