阶乘之和
描述
输入n,计算S=1!+2!+3!+4!+······+n!的末6位(不包前导0)。n<=10^6,n!表示前n个正整数之积。
输入
10
输出
37913
分析
首先因为只要末6位,所以输出时对10^6取模。但n的数值很大,如果直接进行阶乘再取模,仍然有会溢出。所以我们可以对每一步计算进行取模结果不变(存在:要计算只包含加法、减法和乘法的整数表达式除以正整数n的余数,可以在每一步计算之后对取余,结果不变)。但即使是这样,当n的值很大时,需要进行的运算时间就十分的长,所以我们需要找出规律,进行优化。因为25!末尾有6个0,所以从25开始,后面所有项都不会影响和的末6位——只需要在程序的前面加一条语句“if(n>25) n=25;”,效率和溢出都将不存在问题。
代码演示
#include
<iostream
>
#include
<time
.h
>
using namespace std
;
int
main()
{
const int
MOD = 1000000;
int n
, S = 0;
cin
>> n
;
if (n
> 25) n
= 25;
for (int i
= 1; i
<= n
; i
++) {
int factorial
= 1;
for (int j
= 1; j
<= i
; j
++)
factorial
= (factorial
*j
%MOD);
S = (S + factorial
) % MOD;
}
cout
<< S << endl
;
cout
<< "Time used=" << (double
)clock() / CLOCKS_PER_SEC << endl
;
return 0;
}