问题:
如果 x 加上 x 的各个数字之和得到 y, 就说 x 是 y 的生成元。 给出 n( 1 ≤ n ≤ 100000), 求最小生成元。 无解输出 0。 例如, n= 216, 121, 2005 时的解分别为 198, 0, 1979。
C 语言代码:
#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 = 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;
}
Haskell 语言代码:
dsum m
| m < 10 = m
| otherwise = dsum (div m 10) + mod m 10
digGen n = head ([m | m <- [1..n], m + dsum m == n] ++ [0])
Haskell 写这类算法也太 easy 了。