阶乘之和
程序员文章站
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位正整数之积)。
下一篇: 7. Reverse Integer