//1到n 各个出现的个数 #include<iostream> #include<stdio.h> #include<algorithm> #include<string.h> using namespace std; int main() { int n; while(~scanf("%d",&n)) { int a[10]; memset(a,0,sizeof(a)); int d=1; while (1) { int x=n%d,///记录第C位的右边那个位,如果c==1 那么就相当于c有x个 ///后一位 y=n/(d*10),///表示第C位的左边那个位要转Y次,每满1轮就相当于有D个数(0~9) ///前一位 c=(n/d)%10;///记录当前的位,判断前C-1个数满1轮 ///单前位 printf("%d %d %d\n",x,y,c); if (!c) a[0]+=(y-1)*d+x+1;///当C==0,表示不满1轮,-1再加回剩下的 else a[0]+=y*d;///满1轮就算出Y轮的个数 for (int i=1; i<=9; i++) if (i<c)///当i<c 表示前c个数比y多了1轮 a[i]+=(y+1)*d; else if (i==c)///多不了1轮 a[i]+=y*d+x+1; else a[i]+=y*d;///满Y轮 d*=10; if (!y) break; } for (int i=0; i<10; i++) printf("%d\n",a[i]); } return 0; }
原文:http://blog.csdn.net/lp_opai/article/details/44540047