例题3-5 生成元(Digit Generator)
如果x加上x的各个数字之和得到y,就说x是y的生成元。给出n(1<=n<=100000),求最小生成元。无解输出0。例如,n=216,121,2005时的解分别为198,0,1979。
//得出的条件有
//给出n 求最小生成元 设为m 且m < n
//无解输出0
# include <stdio.h>
# include <string.h>
# define maxn 100005
int a[maxn];//定义生成元数组
void generate() //一次性枚举所有生成元,也称打表操作
{
int x, y, m;
memset(a, 0, sizeof(a));
for(m = 1; m < maxn; m++)
{
;
int x = m, y = m;
while(x > 0)
{
//表示y = x加上x的各个数字之和
y += x%10;
x /= 10;
}
//如果生成元数组上值为零或者生成元小于它,则生成元m赋给a[y]
if(a[y] == 0 || m < a[y])
a[y] = m;
}
}
int main()
{
generate();
int T, n;
scanf("%d", &T);
while(T--) // 规定输入的元素个数
{
scanf("%d", &n);
printf("%d\n", a[n]);//a[n]目的是查询 生成元数组中的生成元
}
return 0;
}
//具体得看题目要求的输入输出格式