统计每一位上各数字出现的次数并用数组进行存储
由于最高位没有0,需要对0进行特殊处理
对于xyz这个数字,有: 从0-9开始, 数字0(最小)在个位出现x10+y+1次(就算xyz==0也成立) 数字1在个位出现的次数要进行讨论, 如果z>=1,那么1在个位出现的次数就是x10+y+1次 如果z<1,那么这个结果就要少1次,也就是x*10+y次 剩下数字以此类推
十位上的数字 0的计算:由于0不出现在最高位,且y的值可能为0,所以需要进行讨论 当y>0时:0出现x*10次 当y==0时:0出现(x-1)10+z+1次 1的计算: 当y>1时:1出现(x+1)10次 当y==1时:1出现x10+z+1次 当y<1时:1出现x10次 剩下数字和位数以此类推
总结出以下代码:
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
int contnumber(long long a,long long b){
long long res=0;
long long weight=1;
long long last=0;
while(1){
long long k=b%10;
b/=10;
//if(b==0&&a==0)return res;
if(k>a){
if(a==0&&weight!=1)res+=weight*(b);
else res+=weight*(b+1);
}else if(k<a){
res+=weight*(b);
}else if(k==a){
if(a==0){
if(weight==1)res+=weight*(b)+1;
else res+=weight*(b-1)+last+1;
}
else res+=weight*(b)+last+1;
// if(a==1){
// printf("b=%d last+1=%d res=%d\n",b,last+1,res);
// }
}
last+=k*weight;
weight*=10;
if(b==0)return res;
}
}
void caculate(long long number,long long *cnt){
for(int i=0;i<10;i++){
cnt[i]=contnumber(i,number);
//if(i==1)printf("i=1 %d\n",cnt[1]);
}
}
int main(){
long long a,b;
cin>>a>>b;
long long aa[10]={0};
caculate(a-1,aa);
long long bb[10]={0};
caculate(b,bb);
int res[10]={0};
for(int i=0;i<10;i++){
//printf("%d-%d=%d ",bb[i],aa[i],bb[i]-aa[i]);
printf("%d ",bb[i]-aa[i]);
}
system("pause");
return 0;
}