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
主体思想是找出每一个数为上的1的个数,就是说 个位一共出现几个一,十位一共出现了几个1``````
可以考虑写一个函数求出1到n的数中一共的1的个数
#include<stdio.h>
int m[12]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
int geshu(int t)
{
if(t==-1)return 0;
int i=0,res=0;
while(1)
{
if(m[i]>t)break;
if((t/m[i])%10>1)
{
res+=((int)t/m[i+1]+1)*m[i];
// printf("%d*\n",res);
}
else if((t/m[i])%10==1)
{
res+=((int)t/m[i+1])*m[i]+t%m[i]+1;
// printf("%d**\n",res);
}
else
{
res+=(int)t/m[i+1]*m[i];
// printf("%d***\n",res);
}
++i;
}
return res;
}
int main()
{
int a,b;
while(scanf("%d%d",&a,&b)!=EOF)
{
if(a==0&&b==0)break;
if(a>b){a^=b^=a^=b;}
printf("%d\n",geshu(b)-geshu(a-1));
}return 0;
}