学习

    xiaoxiao2022-07-06  180

    阶乘之和

    描述

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

    输入

    10

    输出

    37913

    分析

    首先因为只要末6位,所以输出时对10^6取模。但n的数值很大,如果直接进行阶乘再取模,仍然有会溢出。所以我们可以对每一步计算进行取模结果不变(存在:要计算只包含加法、减法和乘法的整数表达式除以正整数n的余数,可以在每一步计算之后对取余,结果不变)。但即使是这样,当n的值很大时,需要进行的运算时间就十分的长,所以我们需要找出规律,进行优化。因为25!末尾有6个0,所以从25开始,后面所有项都不会影响和的末6位——只需要在程序的前面加一条语句“if(n>25) n=25;”,效率和溢出都将不存在问题。

    代码演示

    /* *阶乘之和 */ #include<iostream> #include<time.h> using namespace std; int main() { const int MOD = 1000000; int n, S = 0; cin >> n; if (n > 25) n = 25; for (int i = 1; i <= n; i++) { int factorial = 1; for (int j = 1; j <= i; j++) factorial = (factorial*j%MOD); S = (S + factorial) % MOD; } cout << S << endl; cout << "Time used=" << (double)clock() / CLOCKS_PER_SEC << endl;//clock()函数可以获得整个程序的运行时间,这个时间除以常数CLOCKS_PER_SEC之后得到的值以“秒“为单位。 return 0; }
    最新回复(0)