问题:阶乘 之和
输入 n, 计算 S = 1! + 2! + 3! +… + n! 的末 6 位( 不含前导 0)。 n ≤ 1 0 6 n ≤ 10^6 n≤106, 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 语言则陷入计算机数据各种转换的细节中。