在论坛看到一个新生问这个题了,转化成字符串然后枚举肯定会超时。
1704
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1704
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<stdio.h> 2 #define N 10 3 int d[N]; 4 int value; 5 void deal (int n) 6 { 7 if(n<=0) return; 8 int one,ten,i;// one分别代表个位和十位 9 one=n%10; 10 n/=10; 11 ten=n; 12 for(i=0;i<=one;i++)//计算个位上出现的次数 13 { 14 d[i]+=value; 15 } 16 while(ten)//计算例如197中 除去个位 十位上9和1出现的次数 17 { 18 d[ten%10]+=(one+1)*value; 19 ten/=10; 20 } 21 for(i=0;i<10;i++)//计算 例如197 190以下的出现的次数。 22 { 23 d[i]+=n*value; 24 } 25 d[0]-=value; 26 value*=10; //权值乘以10 27 deal(n-1);//递归运算 此时n已经改变 28 } 29 int main() 30 { 31 int a,i; 32 scanf("%d",&a); 33 for(i=0;i<10;i++) 34 { 35 d[i]=0; 36 } 37 value=1; 38 deal(a); 39 for(i=0;i<10;i++) 40 { 41 printf("%d\n",d[i]); 42 } 43 return 0; 44 }