UVa 1583 Digit Generator --- 水题+打表

  UVa 1583

  题目大意:如果x加上x的各个数字之和得到y,那么称x是y的生成元。

       给定数字n,求它的最小生成元

  解题思路:可以利用打表的方法,提前计算出以i为生成元的数,设为d,并保存在a[d]中(a[d]=i),反复枚举,若是初次遇到或遇到更小的则更新

  相关说明:本来按书上来,在更新数组a时,if里是有或上 i < a[y]这个条件的,

       但观察到由于i是从小到大枚举的,因此只会更新一次,即第一次填进去的就是最小生成元,因此去掉仍然AC

/* 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
", a[n]);
    }//while(t)


    return 0;
}
View Code