当前位置: 代码迷 >> 综合 >> 用 Haskell 求解 ACM 竞赛题(8):  生成 元( Digit Generator, ACM/ ICPC Seoul 2005, UVa1583)
  详细解决方案

用 Haskell 求解 ACM 竞赛题(8):  生成 元( Digit Generator, ACM/ ICPC Seoul 2005, UVa1583)

热度:47   发布时间:2023-12-12 16:22:39.0

问题:
如果 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 了。

  相关解决方案