生成元(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
", x, y);
if (ans[y] == 0 || m < ans[y]) {
ans[y] = m;
printf("ans[y] = %d
", ans[y]);
}
}
scanf("%d", &T);
while(T--) {
scanf("%d", &n);
printf("%d
", 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
", 0);
break;
}
i++;
int x = i, y = i;
while (x > 0) {
y += x % 10;
x /= 10;
}
if (y == n) {
printf("%d
", i);
break;
}
}
}
return 0;
}