1的个数(数学)
1的个数
时间限制:1000 ms | 内存限制:65535 KB
难度:3
- 描述
-
给你两个数a和b,你的任务是计算出1在a和b之间出现的次数,比如说,如果a=1024,b=1032,那么a和b之间的数就是:1024 1025 1026 1027 1028 1029 1030 1031 1032则有10个1出现在这些数中。
- 输入
- 输入不会超过500行。每一行有两个数a和b,a和b的范围是0 <= a, b <= 100000000。输入两个0时程序结束,两个0不作为输入样例。
- 输出
- 对于每一对输入的a和b,输出一个数,代表1出现的个数。
- 样例输入
-
1 10 44 497 346 542 0 0
- 样例输出
-
2 185 40
- 来源
- heroj
- 题解:坑了一早上。。
- 代码:
-
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int p[20]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000}; 5 int get1(int x){ 6 int sum=0,k=0; 7 int t=x; 8 while(t) 9 { 10 if(t%10>1) 11 sum+=p[k]; 12 else if(t%10==1) 13 sum+=x%p[k]+1; 14 15 sum+=t%10*k*p[k-1]; 16 17 t/=10; 18 k++; 19 } 20 return sum; 21 } 22 int main(){ 23 int a,b; 24 while(scanf("%d%d",&a,&b),a|b){ 25 if(a>b)swap(a,b); 26 int ans=get1(b)-get1(a-1); 27 printf("%d\n",ans); 28 } 29 return 0; 30 }