当前位置: 代码迷 >> 综合 >> 生成元(Digit Generator, ACM/ICPC Seoul 2005, UVa1583)
  详细解决方案

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

热度:95   发布时间:2023-12-26 10:31:11.0

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

 

  相关解决方案