竹枫逐风


私信TA

用户名:twfplayer

访问量:3740

签 名:

等  级
排  名 2573
经  验 2243
参赛次数 1
文章发表 5
年  龄 20
在职情况 学生
学  校 咸阳师范学院
专  业 软件工程

  自我简介:

求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 人评分

  评论区

  • «
  • »