欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

阶乘之和

程序员文章站 2022-03-24 09:15:37
...

阶乘之和

#include <iostream>
using namespace std;

long factorial(int n)
{
    long res=1;
    for(int i=1;i<=n;i++)
        res*=i;
    return res;
}

int main()
{
    int t;
    cin>>t;
    long sum=0;
    for(int i=1;i<=t;i++)
        sum+=factorial(i);
    cout<<sum%1000000<<endl;
    return 0;
}

或者

#include<stdio.h>
int main()
{
    int n,i,j,s=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        int factorial=1;
        for(j=1;j<=i;j++)
        {
            factorial*=j;
        }
         s+=factorial;
    }
    printf("%d\n",s%1000000);
    return 0;
}

n=100时,输出-961703.直觉告诉我们乘法又溢出了。下面把程序改成“每步取模”的形式,同时加一个计时器,查看运行速度。
CLOCKS_PER_SEC是标准c的time.h头函数中宏定义的一个常数,表示一秒钟内CPU运行的时钟周期数,用于将clock()函数的结果转化为以秒为单位的量.

#include<stdio.h>
#include<time.h>
int main()
{
    const int MOD=1000000;
    int n,i,j,s=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        int factorial=1;
        for(j=1;j<=i;j++)
        {
            factorial=(factorial*j%MOD);
        }
         s=(s+factorial)%MOD;
    }
    printf("%d\n",s);
    printf("Time used=%.2f\n",(double)clock()/CLOCKS_PER_SEC);
    return 0;
}

常量定义MOD,改善了程序的可读性,也方便修改(假设题目改成求末5位正整数之积)。

相关标签: 乘法溢出