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

注意事项: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 条评论

C语言菜狗子01 4年前 回复TA
@Joker. 我也是
Joker. 4年前 回复TA
#include<stdio.h>
int main()
{
	int j,i,n,Sn,item;
	scanf("%d",&n);
	Sn=0;
	for(i=1;i<=n;i++)
	{
		item=1;
	for(j=1;j<=i;j++)
		item=item*j;
		Sn=Sn+item;
	}
		printf("%d",Sn);
		return 0;
}
哪里出错了?
一休。 4年前 回复TA
@ALVIN 他这个  阶乘   0  的阶乘 还是0 好像 是不是错了?
ALVIN 4年前 回复TA
# include <stdio.h>
int main(void)
{
	long int add(unsigned int n);//函数声明 
	unsigned int n;
	scanf("%d", &n);
	if(n<20 && n>=0)
	{														  
		printf("%ld\n", add(n));
	}
	else
		printf("error");				
	return 0;		
}

long int add(unsigned int n)
{
	long int suma=0,s=1;
	int i;
	if(n == 0)
	suma = 1;
	else
	for(i=1;i<=n;i++)
	{
		s = s * i;
		suma = suma + s;
	}
	return suma;
}
答案错误50,求解
xxxx2020 4年前 回复TA
@起凡 用long int
王玉涛 4年前 回复TA
#include<stdio.h>

int main()
{
	int n,i,j;
	long int Sn;
	scanf("%d",&n);
	if(n<=20){
	for(i=1;i<=n;i++){
		int m=1;
		for(j=1;j<=i;j++){
			m=m*j;
		}
		Sn+=m;
	}
}
	printf("%d",Sn);
	return 0;
}
答案错误是啥鬼
苦竹 4年前 回复TA
@起凡 要用long int定义,防止溢出。网站的编译器好像int和long int字节数不一样,但我查CSDN在window 32位都是四个字节。
起凡 4年前 回复TA
#include <stdio.h>
int main()
{
	int n;
	int i;
	int j;
	int b=0;
	scanf("%d", &n);
	if (n == 0)
	{
		printf("1");
	}
	else
	{
		for (i = 1; i <= n; ++i)
		{
			int num = 1;
			for (j = 1; j <= i; ++j)
			{
				num = num * j;
			}
			b = num + b;
		}printf("%d", b);
	}
	return 0;
}
有人能帮我看看我那错了吗
赵日天 4年前 回复TA
@zsai 你这形参怎么没定义数据类型呢
姜佳星 4年前 回复TA
@yeats long int   %ld