题目描述:
给定两个数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<100 000 000。
输入两个0时程序结束,两个0不作为输入样例。
输出:
对于每一对输入的a和b,输出一个数,代表1出现的个数。
样例输入:
1 10
44 497
346 542
1199 1748
0 0
样例输出:
2
185
40
666
解题思路:
本题要求出1在两个数a和b之间出现的次数。可以由分治算法的思想,先求出1在0到a之间出现的次数,再求出1在0到b之间出现的次数,然后两者相减即可。现在的问题转换为如何求出在0到a之间出现的次数。
#include<iostream>
using namespace std;
int deal(int n){
int sum=0,i,j,k;
for( i=1;i<=n;i++) //检查每个数
{ j=i;
while(j!=0) //之前我在这里用了 a ...,一直错误...想了想才发现问题...
{
k=j%10; //从个位开始,检查每一个 位。
if(k==1)
sum++; //如果相等,加 一。
j=j/10; //检查后,除去这个 位
}
}return sum;}
int main(){
int a,b,S;
while(cin>>a>>b){
if(a==0&&b==0)break;
if(a<b){int tmp=b;b=a;a=tmp;}
S=deal(a)-deal(b);
cout<<S<<endl;
}
return 0;}