阶乘之和

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

样例输入:

10

样例输出:

37913

代码如下

#include<iostream>
using namespace std;

int main()
{
    int num;            //存放数据
    int n;                //要输入的数
    
    while(cin>>n)        
    {
        int s = 0;
        
        for (int i = 1; i <= n; i++)        //小于 n 的整数
        {    
            num = 1;
            
            for (int j = 1; j <= i; j++)    //计算阶乘
                num *= j;
                
            s += num;                    //求和
        }
            
            
        
    //    cout<<s<<endl;
        cout<<(s % 1000000 )<<endl;        // 取余
    }
    return 0;
 }

但是当我们输入的 n = 100 时,输出结果为-961703。直接告诉我们,乘法溢出了。

**注:要计算只包含加法、减法和乘法的整数表达式除以正整数 n 的余数,可以在每步计算之后对 n 取余,结果不变。一个数对另一个数反复取余结果不变,即  a % b == a % b % b % b

代码如下

#include<iostream>
using namespace std;

int main()
{
    int num;            
    int n;                
    
    while(cin>>n)        
    {
        int s = 0;
        
        for (int i = 1; i <= n; i++)        
        {    
            num = 1;
            
            for (int j = 1; j <= i; j++)    
                num = num % 1000000 * j;
                
            s = (s + num) % 1000000;                    
        }            
            
        cout<<s<<endl;    
    }
    return 0;
 }

**注:当 n 从40开始,答案始终不变。因为 25!末尾有 6 个 0 ,所以后面的所有相都不会影响和的末位 6 位数————只需要在程序前面加一条语句 " if (n > 25)   n = 25; ",就可提高效率

原文地址:https://www.cnblogs.com/go-alltheway/p/13336019.html