求1的数目

来源:互联网 发布:出国推荐信 知乎 编辑:程序博客网 时间:2024/04/28 20:37

题目:

给定一个十进制的正整数N,求从1开始到N的所有整数中,出现1的个数。

如:N=2,即1,2,出现11

N=12,即1,2,3,4,5,6,7,8,9,10,11,12,出现51.

写一个函数f(N),返回1N之间出现1的个数,如f(12)=5.

注意:请你在写完基本功能代码V1.0版本后进行压力测试,看看当N=100000000N=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;


比如输入12345(F(12305)=8121)

计算个位数(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的总个数。

0 0
原创粉丝点击