PTA 7-41 计算阶乘和

 看到这个题,我首先想到的是一个双重循环,代码如下

#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;
}

  • 9
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值