题目:
给定一个十进制的正整数N,求从1开始到N的所有整数中,出现1的个数。
如:N=2,即1,2,出现1个1
N=12,即1,2,3,4,5,6,7,8,9,10,11,12,出现5个1.
写一个函数f(N),返回1到N之间出现1的个数,如f(12)=5.
注意:请你在写完基本功能代码V1.0版本后进行压力测试,看看当N=100000000和N=1000000000你的代码还能否运算出结果。如果无法在短时间内运算出结果,请你改进算法,完成一个能通过压力测试的v2.0版本代码。
代码如下:
#include "stdio.h"
int main()
{
__int64 i,a,b,c,num,count=0;
scanf("%I64d",&num);
for(i=10;i<=10000000000;i*=10)
{
a=num/i;
b=(num-a*i)/(i/10);
c=num%(i/10);
switch(b)
{
case 0:
count+=a*i/10;
break;
case 1:
count+=a*i/10 + c+1;
break;
default :
count+= ( a+1 )*i/10;
}
if(num/i<=0)
break;
}
printf("%I64d\n",count);
return 0;
}
设count为1的总个数,i=1,10,100,1000......
当b==0时,n += a*i;
当b==1时,n += a*i+c+1;
当b>=2时,n += (a+1)*i;
计算个位数(i=1)时,将12305分为a:1230 b:5 c:0
因为b>=2
n += (a+1)*i;
计算十位数(i=10)时,将12305分为a:123 b:0 c:5
因为b==0
n += a*i;
.
.
.
计算万位时(i=10000)时,将12305分为a:0 b:1 c:2305
因为b==1
n += a*i+c+1;
n即为1的总个数。