15. 阶乘之和

题目:

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

样例输入:

10

样例输出:

37913

思路:

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

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

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

扫描二维码关注公众号,回复: 8353107 查看本文章

还需注意,在大数做乘法时的溢出问题。解决方法:在每次计算完当前项结果之后,马上进行取模,再每次累加之后,迅速对 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;
}

猜你喜欢

转载自www.cnblogs.com/Hello-Nolan/p/12114973.html