原题链接:[编程入门]阶乘求和
求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字(n不超过20)。
解题思路:
代码本身很简单,只需要用到for循环,不管是阶乘还是阶乘的累加,都可以计算。
注意事项:
需要注意的是整形的存储范围
| int | -2147483648~+2147483647 |
| long long int | -9223372036854775808~+9223372036854775807 |
在本题中采取int,我们很容易就会溢出范围,因此在这里我们使用long long int。
参考代码:
代码一:为阶乘计算单独一个for循环,并将其嵌套到累加计算的for循环内。(也可以把计算阶乘的for单独拿出去,做一个函数体,不过在本题中显然反而提升了复杂度。不建议采用)
#include <stdio.h>
int main()
{
int n,i,j;
long long int a=1,sn=0; //避免溢出
scanf("%d",&n);
for(j=n;j>0;j--){
for(i=j;i>0;i--){ //此处用的是由大到小的算法,for(i=1;i<=j;i++),结果不会有变化。
a=a*i;
} //这个for循环是用于计算阶乘的
sn+=a; //这里用于累加
a=1; //给a重新赋1()
}
printf("%lld",sn);
return 0;
}
/*
计算流程:以n=5为例
a5=1*5*4*3*2*1 //a5表示a的值在本次for循环中为5! 其余a4,a3,a2,a1同理
sn=0+a5
a4=1*4*3*2*1
sn=a5+a4
......
以此类推,以下省略
*/代码二:直接计算累加结果
#include <stdio.h>
int main()
{
int n,i,j;
long long int a=1,sn=0; //避免溢出
scanf("%d",&n);
for(j=1;j<=n;j++){ //此处只能采用由小到大的算法
a=j*a;
sn+=a;
}
printf("%lld",sn);
return 0;
}
/*
计算流程:以n=5为例
1*1+2*1+3*2+4*6+5*24
//即1!+2!+3!+4!+5!
*/0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复