解题思路:解本题时,基本思路是,先求阶乘,再求阶乘的和。  自定义函数求阶乘。循环作和。

注意事项:1.采取自定函数求阶乘。用递归法。需注意递归法的尽头。(在本题中,fac函数的if语句作递归法的尽头,不可省略。)

              2.要注意最后结果的数值范围,避免溢出发生错误。

参考代码

#include<stdio.h>
long int fac(unsigned int n)  //定义为long int 型,避免溢出
{
    long int f;
    if(n==0) return 1;        //当n=0是,递归法到尽头,依次返回函数值。
    f=fac(n-1)*n;
    return (f);               //返回最后一次函数值,即单次阶乘的最后结果
}

int main()
{
    unsigned int n;
    long int s=0;
    int i;
    scanf("%d",&n);
    for(i=1;i<=n;i++)  s+=fac(i);    //以循环控制阶乘的和。fac函数每一次的返回值作为s的自加值
    printf("%ld",s);
    return 0;
}


点赞(16)
 

0.0分

45 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 137 条评论

加油啊 3年前 回复TA
@好想进省一 限制n的大小,如果超过20求和的值就会超过int的范围,导致溢出
好想进省一 3年前 回复TA
n不超过20是什么意思呢,为什么用long int或者long long int正确,但是用int就会错误呢
Syunach 3年前 回复TA
@听说过白菜吗 int main() { 	int i, n; 	int an = 1; 	int sn = 0; 	scanf_s("%d", &n); 	if (n <= 20) 	{ 		for (i = 1; i <= n; i++) 		{ 			an = an * i; 			sn = sn + an; 		} 		printf("%d", sn); 	} 	return 0; }我这个也不过啊
听说过白菜吗 3年前 回复TA
#include <stdio.h>
long long sum = 0;
long int fun(int x)
{
	int num = 1;
	for (int i = 1; i <= x; i++)
	{
		num *= i;
	}
	return num;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	if (n == 0)
		printf("1");
	else
	{
		if (n <= 20)
		{
			for (int i = 1; i <= n; i++)
			{
				sum += fun(i);
			}
			printf("%ld", sum);
		}
	}
	return 0;
}



大佬们,给纠正一下呗,提交错误,我都裂了
白色枫叶 3年前 回复TA
#include <stdio.h>

int main()
{
	int n;
	int i;
	int a;
	long int sum=1;
	long int sum1=0;
	
	scanf("%d",&n);
	
	for(i=1;i<=n;i++){
		sum=sum*i;
		sum1=sum1+sum;
	}
	printf("%d",sum1);
	
	return 0;
}
把sum定义为long int不过,原来的int也不过,麻了:(
木南 3年前 回复TA
@菜修狗 long 的位数应该也不够   20!是个19位数   long储存的最大整数是个11位数  我用了long long过了
指针原来是套娃的 3年前 回复TA
#include <stdio.h>

int main ()
{
	int n;
	scanf("%d",&n);
	int p[n];
	int i,j;
	long int sn=0;
	
	for(i=0;i<n;i++){
		p[i]=1;
	}
	
	for(i=0;i<n;i++){
		for(j=i+1;j>0;j--){
			p[i]*=j;
		}
		sn+=p[i];
	}
	printf("%ld",sn);
	
	return 0;
 } 
大神们这个提交上去显示错误50是因为啥啊
◈娤Ⓑ崾趁早ī♦ 3年前 回复TA
@xisoni 没有在前面声明函数
jjjjc 3年前 回复TA
@菜修狗 噢噢,我懂了,把d改为ld
jjjjc 3年前 回复TA
@菜修狗 我写的跟你一样,运行结果是对了的,但提交上去就不对