- 阶乘问题
(1) 正常求解,但是存在溢出问题
#include <iostream>
#include<stdio.h>
using namespace std;
int main()
{
int n,s,sum;
scanf("%d",&n);
for(int i=0;i<=n;i++){
int a=1;
for(int j=1;j<=i;j++){
a*=j;
}
sum +=a;
}
printf("%d",sum%1000000);
return 0;
}
(2) 中间过程引入取余运算(要计算只包含加法、减法、乘法的整数表达式除以正整数n的余数,可以在每一步计算时对n取余,结果不变),同时计算时间,会快很多。
同时这个程序结束之前调用此函数(clock()),便可获得整个程序的运行时间,除以CLOCKS_PER_SEC获得“秒”为单位
#include <iostream>
#include<stdio.h>
#include<time.h>
using namespace std;
int main()
{
const int MOD=1000000;//引入
int n,s=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
int a = 1;
for(int j=1;j<=i;j++){
a=(a*j)%MOD;
}
s=(s+a)%MOD;
}
printf("%d\n",s);
printf("Time used=%.2f\n",(double)clock()/CLOCKS_PER_SEC);
return 0;
}
(3)同时对于这道题来看当i>25之后的项都不会影响结果所以应加上if(i>25)break;便可解决时间和溢出的问题:
#include <iostream>
#include<stdio.h>
#include<time.h>
using namespace std;
int main()
{
const int MOD=1000000;
int n,s=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
int a = 1;
if(i<=25)
{for(int j=1;j<=i;j++){
a=(a*j)%MOD;
}
s=(s+a)%MOD;}
else {
break;
}
}
printf("%d\n",s);
printf("Time used=%.2f\n",(double)clock()/CLOCKS_PER_SEC);
return 0;
}