求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语言程序设计教程(第三版)课后习题6.5 (C语言代码)浏览:595 |
【计算球体积】 (C语言代码)浏览:1103 |
C语言训练-数字母 (C语言代码)浏览:608 |
C语言程序设计教程(第三版)课后习题8.4 (C语言代码)浏览:529 |
星期判断机 (C语言代码)浏览:859 |
蚂蚁感冒 (C语言代码)浏览:775 |
简单的a+b (C语言代码)浏览:531 |
C语言训练-亲密数 (C语言描述,反正怎么都能对)浏览:2169 |
C语言程序设计教程(第三版)课后习题5.6 (C语言代码)浏览:593 |
老王赛马 (C++代码)浏览:905 |