当前位置: 代码迷 >> 综合 >> 用 Haskell 求解 ACM 竞赛题(7):阶乘之和
  详细解决方案

用 Haskell 求解 ACM 竞赛题(7):阶乘之和

热度:61   发布时间:2023-12-12 16:22:55.0

问题:阶乘 之和
输入 n, 计算 S = 1! + 2! + 3! +… + n! 的末 6 位( 不含前导 0)。 n ≤ 1 0 6 n ≤ 10^6 n106, n! 表示前 n 个正整数之积。
样例输入: 10
样例输出: 37913

【分析】 这个任务并不难, 引入累加变量 S 之后, 核心算法只有“ for( int i = 1; i < = n; i + +) S + = i!”。 不过, C 语言并没有阶乘运算符, 所以这句话只是伪代码, 而不是真正的代码。 事实上, 还需要一次循环来计算 i!, 即“ for( int j = 1; j < = i; j + +) factorial* = j;”。

C语言代码:

#include <stdio.h> 
int main() { int n, S = 0; scanf("% d", &n); for( int i = 1; i <= n; i++) { int factorial = 1; for( int j = 1; j <= i; j++) factorial *= j; S += factorial; } printf("% d\ n", S % 1000000); return 0; 
}

这个算法在 C 语言因整数溢出大伤脑筋,题目加入了限制,要求结果输出最后六位。另外,上面代码计算效率也成问题,此处不展开讨论。在 Haskell 中,处理整数顺手得多。下面给出 Haskell 代码,无论计算精度还是运行效率,都有很好的表现。

summ' s t i n | i == n    = s+t| otherwise = summ' (s+t) (t*(i+1)) (i+1) nsumm 1 = 1
summ n = summ' 0 1 1 nmain = dos <- getLinereturn (summ (read s))

给我的感觉是,在求解问题时,Haskell 语言专注于描述问题本身如何求解,C 语言则陷入计算机数据各种转换的细节中。

  相关解决方案