UVa 1583 Digit Generator --- 水题+打表
题目大意:如果x加上x的各个数字之和得到y,那么称x是y的生成元。
给定数字n,求它的最小生成元
解题思路:可以利用打表的方法,提前计算出以i为生成元的数,设为d,并保存在a[d]中(a[d]=i),反复枚举,若是初次遇到或遇到更小的则更新
相关说明:本来按书上来,在更新数组a时,if里是有或上 i < a[y]这个条件的,
但观察到由于i是从小到大枚举的,因此只会更新一次,即第一次填进去的就是最小生成元,因此去掉仍然AC
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/* UVa 1583 Digit Generator --- 水题+打表 */ #include <cstdio> #include <cstring> const int maxn = 100005; int a[maxn]; //a[i]的值表示i的最小生成元是a[i] int main() { memset(a, 0, sizeof a); for (int i = 1; i < maxn; ++i){ int x = i, y = i; //通过i并类加上各位置的和得到y,因而i是y的生成元 a[y] = i; while (x){ y += x % 10; x /= 10; } //i是y的生成元 由i--->y的 //若是第一次算出y 或者 当前生成元比以前的更小 则更新 //本来按书上来if里是有或上 i < a[y]这个条件的 //但是由于i是从小到大枚举的 因此只会更新一次 即第一次填进去的就是最小生成元 因此去掉仍然AC if (a[y] == 0){ // || i < a[y] a[y] = i; } }//for(i) int t, n; scanf("%d", &t); while (t--){ //打完表后每次读取便可 scanf("%d", &n); printf("%d\n", a[n]); }//while(t) return 0; }