
自己的代码:
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
void trans(int ans[],int digit)
{
while(digit!=0)
{
ans[digit%10]++;
digit=digit/10;
}
}
int main()
{
int n;
cin>>n;
getchar();
while(n>0)
{
int ans[10]={0};
int digit ;
scanf("%d",&digit);
for(int i=1;i<=digit;i++) trans(ans,i);
for(int i=0;i<9;i++)
cout<<ans[i]<<" ";
cout<<ans[9]<<endl;
n--;
}
}
比较蠢,自己编写了一个函数trans,统计一个数字各个位上0-9出现次数。
再对input数字n,从1到n调用这个函数。
写完发现太蠢了,毕竟n-1和n,只需要增加n的各个位上0-9出现次数就可以。
用一个2元数组。ans[i][j] i代表input需要处理的数字,j是0-9中的一个。如ans[123][1]就代表前123个整数顺次写在一起时,1出现的次数。
贴一个网上搜到的题解,侵删。
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
int f[10000][10];
int main()
{
memset(f, 0, sizeof(f));
for (int i = 1 ; i < 10000 ; ++ i) {
for (int j = 0 ; j < 10 ; ++ j)
f[i][j] = f[i-1][j];
int left = i;
while (left) {
f[i][left%10] ++;
left /= 10;
}
}
int t,n;
while (~scanf("%d",&t))
while (t --) {
scanf("%d",&n);
for (int i = 0 ; i < 9 ; ++ i)
printf("%d ",f[n][i]);
printf("%d\n",f[n][9]);
}
return 0;
}