1716: 阶乘之和(2)
Description
输入一个正整数n,计算S=1!+2!+3!+…+n!的末6位(不含前导0)。n的范围为:0<n≤10^6。
Input
一个正整数n。
Output
输出S的末6位数字,不输出前导0。
Sample Input
10
Sample Output
37913
第一种算法:双层循环,运行超时
#include <stdio.h> int main() { int n; int i; int j; int s; int sum = 0; scanf("%d",&n); for (i=1; i<=n; i++) { s = 1; for (j=2; j<=i; j++) { s *= j; s %= 1000000; //忽略六位以后的数字,不影响结果 } sum += s; sum %= 1000000; } printf("%d",sum); return 0; }
第二种算法:利用阶层的记忆性(n! == n*(n-1)!),转换为单层循环
#include <stdio.h> int main() { int n; int i = 1; int s = 1; int sum = 0; scanf("%d",&n); while (i <= n) { s *= i; //n!==n*(n-1)!,所以在求出(n-1)!之后不必再单独求n! s %= 1000000; sum += s; sum %= 1000000; i++; } printf("%d",sum); return 0; }