生成元(Digit Generator, ACM/ICPC Seoul 2005, UVa1583)

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

    

}

猜你喜欢

转载自blog.csdn.net/qq_38735931/article/details/81104829