阶乘之和

                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;
}
 
蒹葭苍苍,白露为霜; 所谓伊人,在水一方。
原文地址:https://www.cnblogs.com/huwt/p/10193022.html