如题,求解1!+2!+3!+…+19!+20!之和。
这道题很简单,循环20次,每次循环总和加上一个因子即可。代码如下:
#include<stdio.h>
int main(){
int sum=0,temp;
for(int i=1;i<=20;i++){ //每次循环相加一个因子
temp = 1;
for(int j=1;j<=i;j++){ //求解每个因子
temp *= j;
}
sum += temp; //加上因子
}
printf("%d\n",sum);
return 0;
}
但是在求解过程中,不难发现,20!=2019!,19!=1918!,18!=18*17!,以此类推,即每个因子等于本次循环次数(第几次)乘以上一个因子。因此我们可以保存上一次的因子,每次乘以相应的循环次数即可得到本次的因子。代码如下:
#include<stdio.h>
int main(){
int sum=0,temp=1;
for(int i=1;i<=20;i++){
temp *= i; //注意因子之间的递推关系;即每次相加的因子其实就是上一个因子乘以本次次数
sum = sum+temp;
}
printf("%d\n",sum);
return 0;
}
降低了时间复杂度,一个数量级的复杂度。