这题的算法不算复杂,依次考虑每个数字在个位,十位等等 的出现次数累加即可,但是相当的复杂阿。。。。。。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; void count(int n,int a[]) { int t=1; int ten,p=0,k=n; while(n>=10) { ten=n/10,p=n%10; if(t>=10) a[0]+=(ten-1)*t; else a[0]+=ten*t; for(int i=1;i<10;i++) a[i]+=ten*t; //note for(int i=0;i<p;i++) a[i]+=t; a[p]+=k%t+1; //note n=ten; t*=10; //cout<<a[7]<<endl; } //cout<<"nis "<<n<<endl; if(k>=10) { for(int i=1;i<n;i++) a[i]+=t; a[n]+=k%t+1; } else { for(int i=0;i<=n;i++) a[i]++; } //cout<<a[7]<<endl; } void printarr(int a[]) { for(int i=0;i<10;i++) { if(i) printf(" "); printf("%d",a[i]); } printf("\n"); } int main() { //freopen("a.txt","r",stdin); //freopen("c.txt","w",stdout); int a1[10],a2[10]; memset(a1,0,sizeof(a1)); memset(a2,0,sizeof(a2)); //count(1199,a1); //printarr(a1); //count(1748,a2); //printarr(a2); int n1,n2; while(scanf("%d%d",&n1,&n2)&&n1&&n2) { //int a1[10],a2[10]; memset(a1,0,sizeof(a1)); memset(a2,0,sizeof(a2)); if(n1<n2) { int tmp=n2; n2=n1;n1=tmp; } count(n1,a1); count(n2,a2); while(n2) { a1[n2%10]++; n2/=10; } for(int i=0;i<10;i++) { if(i) printf(" "); printf("%d",a1[i]-a2[i]); } printf("\n"); } return 0; }