生成元(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;
}