15. 阶乘之和

题目:

输入 n ,计算 S = 1! + 2! + 3! + ...+ n! 的末6位(不含前导0)。 n <= 10^6, n!表示前 n 个正整数之积。

样例输入:

10

样例输出:

37913

 

思路:

用一个累加器 sum 来记录总和,用 term 来表示每一项的阶乘。

第一种方法是用二重循环,中规中矩的算法。

第二种方法,观察可知,后一项的值等于前一项乘当前项序号,于是每次能够利用前面已经算出的阶乘结果,这样就能避免二重循环。

还需注意,在大数做乘法时的溢出问题。解决方法:在每次计算完当前项结果之后,马上进行取模,再每次累加之后,迅速对 sum 也进行取模。

代码:

#include <iostream>
using namespace std;

int main()
{
const int MOD = 1000000;
int sum = 0, n = 0;
cin >> n;

for (int i = 1; i <= n; ++i) {
int static term = 1;
term *= i;
sum += (term % MOD);
}

cout << sum % MOD << endl;

return 0;
}
posted @ 2019-12-29 14:34  Hello_Nolan  阅读(470)  评论(0编辑  收藏  举报