题意:把前n(n≤10000)个整数顺次写在一起:123456789101112...数一数0~9各出现多少次(输出10个整数,分别是0,1,...,9出现的次数)。
分析:观察一下n的数据范围,模拟肯定超时。因此想到了一个方法:打表。开一个二维数组,找出里面的递推关系,每一个数对应的0-9出现值都是在前一个数的基础上增加的,递推关系明显。最后注意一下输出的格式即可。
我的代码:
#include <bits/stdc++.h>
using namespace std;
int ans[10010][10];
int main()
{
memset(ans,0,sizeof(ans));
for(int i=1;i<=10010;i++){
for (int j=0;j<10;j++) ans[i][j]=ans[i-1][j];
int temp=i;
while(temp){ans[i][temp%10]++; temp/=10;}
}
int t,n;
for(scanf("%d",&t);t;t--){
scanf("%d",&n);
for(int i=0;i<9;i++)
printf("%d ",ans[n][i]); printf("%d\n",ans[n][9]);
}
return 0;
}
本文介绍了一种高效算法,用于计算从1到n的整数连续拼接形成的序列中每个数字0-9出现的次数。通过递推方法避免了直接模拟带来的性能问题。
1870

被折叠的 条评论
为什么被折叠?



