题目
把前n(n<=10000)个整数顺次写在一起:123456789101112...数一数0-9各出现多少次(输出10个整数,分别是0,1,...,9出现的次数)。
分析
1.直接求每个n的0-9出现的次数。
2.先求出1-10000之前每个数字对应的0-9出现的次数。
第一种方式效率相对第二种方式较低。
第一种方式
c实现
#include<stdio.h> #include<string.h> #define maxn 13 int ans[maxn]; int main() { int a,b,c; memset(ans,0,sizeof(ans)); scanf("%d",&a); for(int i=1;i<=a;i++){ b = i; //求每个数字中的对应0-9的个数,并加到对应数组 do { c = b%10; ans[c]++; b = b/10; }while(b!=0); } for(int i=0;i<10;i++) { printf(" %d",ans[i]); } return 0; }
第二种方式
c实现
#include<stdio.h> #include<string.h> #define maxn 10010 int ans[maxn][10]; int main() { int b,c,n; memset(ans,0,sizeof(ans)); for(int i=1;i<=10000;i++) { for(b=i;b!=0;) { ans[i][b%10]++; b /= 10; } for(int j=0;j<10;j++) { ans[i][j] += ans[i-1][j]; } } scanf("%d",&n); for(int i=0;i<10;i++) { printf("%d ",ans[n][i]); } }
这种方式会利用上一个数中统计到的对应的0-9的个数,与当前数的0-9的个数求和来得到从0到n的对应的0-9的个数。