输入n,计算S = 1! + 2! + 3! + ...... + n!的末6位(不含前导0)。 n <= 10^6
样例输入:10
样例输出:37913
分析:此题需要注意溢出和时间的问题
溢出解决方案:要计算加法、减法和乘法的整数表达式除以正整数n的余数,可以再每步计算之后对n取余,结果不变。(原理:(a + b) % n = a % n + b % n)
n很大时,时间长的解决方案:注意到25!的阶乘有末尾6个0,则有(a + b) % n = a % n。也就说如果n大于24就相当于只计算n为24。(有兴趣的,可以尝试下没有优化前需要花多长时间)
#include<stdio.h> #include<time.h> int main(){ int n,sum = 0; const int MOD = 1000000; scanf("%d",&n); if(n > 24){ n = 24; } for(int i = 1; i <= n; i++){ int factorial = 1; for(int j = 1; j <= i; j++){ factorial = (factorial * j % MOD); } sum += factorial; } printf("%d\n",sum % MOD); printf("Time used=%.2lf\n",(double)clock()/CLOCKS_PER_SEC); return 0; }
去掉
if(n > 24){ n = 24; }
就可以测试没有优化前需要花多长时间
优化前与优化后的对比(单位s):