zoukankan      html  css  js  c++  java
  • 阶乘之和

    输入 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; ",就可提高效率

  • 相关阅读:
    Pyramid of Glasses 酒杯金字塔 [CF-676B]
    BZOJ 2456mode
    Hamburgers [CF-371C]
    lowbit
    two point
    大O表示法的理解
    6. 第 6 章 队列
    5. 第 5 章 栈
    3. 第 3 章 向量
    10. 第 10 章 指针
  • 原文地址:https://www.cnblogs.com/go-alltheway/p/13336019.html
Copyright © 2011-2022 走看看