生成元(Digit Generator, AMC/ICPC Seoul 2005, UVa1583)
标签(空格分隔): c
题目
如果 x 加上 x 的各个数字之和得到的 y,就说 x 是 y 的生成元。给出 n (1 <= n <= 100000),求最小生成元。无解输出 0。例如,n = 216,121,2005 时的解分别为 198,0,1979。
分析
假设所求的生成元为 m。可以知道 m < n。尝试枚举所有的 m < n,取出是 n 的生成元,没有则为 0。
已知 198 是 216 的生成元,计算公式如下:
198
= 198 + 1 + 9 + 8
= 216
解题
第一种:
#include <stdio.h>
#include <string.h>
#define maxn 100005
int ans[maxn];
int main() {
int T, n;
memset(ans, 0, sizeof(ans));
for (int m = 0; m < 217; m++) {
int x = m, y = m;
while (x > 0) {
y += x % 10;
x /= 10;
}
printf("x = %d, y = %d\n", x, y);
if (ans[y] == 0 || m < ans[y]) {
ans[y] = m;
printf("ans[y] = %d\n", ans[y]);
}
}
scanf("%d", &T);
while(T--) {
scanf("%d", &n);
printf("%d\n", ans[n]);
}
return 0;
}
第二种:
#include <stdio.h>
int main() {
int i = 0, n;
scanf("%d", &n);
if (n >= 1 && n <= 100000) {
for (;;) {
if (i == 100001) {
printf("%d\n", 0);
break;
}
i++;
int x = i, y = i;
while (x > 0) {
y += x % 10;
x /= 10;
}
if (y == n) {
printf("%d\n", i);
break;
}
}
}
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。