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

时间:2023-03-08 17:38:53

  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 = ;
int a[maxn]; //a[i]的值表示i的最小生成元是a[i] int main()
{
memset(a, , sizeof a);
for (int i = ; i < maxn; ++i){
int x = i, y = i;
//通过i并类加上各位置的和得到y,因而i是y的生成元 a[y] = i;
while (x){
y += x % ;
x /= ;
}
//i是y的生成元 由i--->y的
//若是第一次算出y 或者 当前生成元比以前的更小 则更新
//本来按书上来if里是有或上 i < a[y]这个条件的
//但是由于i是从小到大枚举的 因此只会更新一次 即第一次填进去的就是最小生成元 因此去掉仍然AC
if (a[y] == ){ // || 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 ;
}