生成元(Digit Generator, ACM/ICPC Seoul 2005, UVa1583)
如果x加上x的各个数字之和得到y,就说x是y的生成元。
给出n(1≤n≤100000),求最小 生成元。无解输出0。例如,n=216,121,2005时的解分别为198,0,1979。
分析:
-
首先,穷举法;对所有生成数n有生成元m<n,(生成数>生成元),所以枚举所有的m<n,然后找符合条件的数;但是这样做每次计算一个n的生成元就要枚举n-1个数
-
提高算法效率-->一次性枚举100000以内的所有正整数,标记下标是生成数、数值是生成元的表,最后查表获得值即可;
-
建表:for循环,m加m的各个位的数字和如果等于i值(数组下标),则将m赋值给该元素;
思路:
-
本题重要思想 打表法
#include<stdio.h>
#include<string.h>
#define maxn 100005 //定义稍大一点无所谓的
int ans[maxn]; //数组占用较大,所以定义在main外
int main()
{
int t,n;
memset(ans,0,sizeof(ans));
for(int m=1;m<maxn;m++)
{
int x=m,y=m;
while(x>0){
y+=x%10;
x/=10;
}
if(ans[y]==0 || m<ans[y])ans[y]=m;//要求最小的,所以要比较一下,如果比原来的小,就要重新赋值
}
/***************************以上为打表***************************/
scanf("%d",&t);
while(t--){
scanf("%d",&n);
printf("%d\n",ans[n]);
}
return 0;
}