求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语言代码)浏览:597 |
永远的丰碑 (C语言代码)浏览:698 |
妹子杀手的故事 (C语言代码)浏览:737 |
C语言考试练习题_一元二次方程 (C语言代码)浏览:773 |
C语言程序设计教程(第三版)课后习题6.3 (C语言代码)浏览:543 |
C语言程序设计教程(第三版)课后习题9.2 (Java代码)浏览:696 |
C语言程序设计教程(第三版)课后习题8.3 (C语言代码)浏览:436 |
【排队买票】 (C语言代码)浏览:944 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:606 |
WU-字符串比较 (C++代码)浏览:824 |