看到这个题,我首先想到的是一个双重循环,代码如下
#include<stdio.h>
int main(void)
{
int n;
int sum=1,s=0;
scanf("%d",&n);
for(n;n>=1;n--){
for(int i=1;i<=n;i++){
sum*=i;
}
s+=sum;
sum=1;
}
printf("%d",s);
return 0;
}
但是在途中遇到了一点问题,起初在s+=sum后面没有重新对sum赋值,导致sum延用了第一次内幕for循环的结果,输入3得到了30,于是我便开始调试,当外部for循环进入第二轮时,发现sum变成了6,于是重新赋值了一下,得到了正确的代码。但是感觉这样写怪怪的,于是写出了以下代码。
#include<stdio.h>
int main(void)
{
int n;
int sum=1,s=0;//sum是每一个数字的阶乘,因此要初始化为1;s是sum的和,因此初始化为0
scanf("%d",&n);
for(int i=1;i<=n;i++){
sum=1;//初始化阶乘为1
for(int j=1;j<=i;j++){
sum*=j;
}
s+=sum;//每轮阶乘求和
}
printf("%d",s);
return 0;
}
其实这两段代码就是阶乘相加的顺序不一样,第一个从后往前,第二个从前往后。
还有一种更简洁的方案,如下。
#include<stdio.h>
int main(void)
{
int n=0,sum=0,t=1;
scanf("%d",&n);
for(int i=1;i<=n;i++){
t*=i;
sum+=t;
}
printf("%d",sum);
return 0;
}
//i t sum
//1 1 1
//2 2 3
//3 6 9
//4 24 33
这里没有每次都对t初始化,相反的,每轮循环结束之后,t都是i--的阶乘,sum每轮都有累加。
还有以下方法:考虑到先求n的阶乘
#include<stdio.h>
int fact(int n)
{
int ret;
if(n==0){
ret=1;
}else{
ret=n*fact(n-1);
}
return ret;
}
/*或者直接这样
int fact(int n){
if(n==0) return 1;
else return n*fact(n-1;)
}
*/
int main(void)
{
int n;
scanf("%d",&n);
n=fact(n);
printf("%d",n);
return 0;
}
接下来求1到n的阶乘之和
#include<stdio.h>
int fact(int n)
{
if(n==0){
return 1;
}else{
return n*fact(n-1);
}
}
int main(void)
{
int n;
int j=0;
int sum=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
j=fact(i);
sum+=j;
}
printf("%d",sum);
return 0;
}