问题:
如果 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 10digGen n = head ([m | m <- [1..n], m + dsum m == n] ++ [0])
Haskell 写这类算法也太 easy 了。