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

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

Min 4年前 回复TA
#include <stdio.h>
int main (void)
{
	int sn,i,t=1,b=1,x=0;
	scanf("%d", &sn);
	if(sn<=20)
	{
		for(i = 0; i < sn; ++i)
		{
			t*=b;
			++b;
			x+=t;
		}
	}
	printf("%d", x);
	return 0;
}
我这代码运行起来没有任何问题
为啥一直报错误50?
TTSV 4年前 回复TA
e<stdio.h>
int main()
{
	int a, b, c, d, n;
	scanf("%d", &n);
	for (a = 1, b = a, c = 1; n > 1; b = b + 1, a = a * b, n = n - 1, c = c + a);
	printf("%d",c);
	return 0;
}
求助!  为什么错误50%
黄金瞳 4年前 回复TA
#include<stdio.h>
int main()
{
   int n,p;
   long sum=0;
   scanf("%d",&n);
   while(n)
   {    p=1;
       for(int i=1;i<=n;i++)
       {
           p=i*p;
       }
       sum+=p;
       n--;
   }
   printf("%ld",sum);
}
为啥我也是答案错误50%?
a成成成 4年前 回复TA
@✔✘✔ 需要改变有  1.将递归函数值的类型改为long  2.将sn的类型改为long 3.删除一些冗余的语句如getchar()和将主函数中双重循环改为单层循环
a成成成 4年前 回复TA
@✔✘✔ #include <stdio.h> long ordermulti(int n) { 	if (n <= 1) { 		return 1 ; 	} 	return n * ordermulti(n - 1); }  int main() { 	int n; 	long sn = 0; 	int loop = 1; 	do 	{ 		scanf("%d", &n); 		if (n>=1&&n <= 20)  			loop = 0; 	} while (loop); 	for (int i = 1; i <= n; i++) 		sn += ordermulti(i); 	printf("%ld", sn); }
✔✘✔ 4年前 回复TA
#include <stdio.h>
int ordermulti(int n) {
	if (n <= 1) {
		return 1 ;
	}
	return n * ordermulti(n - 1);
}

int main() {
	int n = 0;
	int sn = 0;
	int loop = 1;
	do
	{
		scanf("%d", &n);
		getchar();
		if (n>=1&&n <= 20) {
			loop = 0;
		}
	} while (loop);
	
	for (int i = 1; i <= n; i++) {
		int an = 0;
		for (int j = 1; j <= i; j++) {
			an = ordermulti(i);
		}
		sn += an;
	}
	printf("%d", sn);
}
老师们,为什么我这样写会提示50%错误
wtf 4年前 回复TA
#include<stdio.h>
int main()
{
	int jiecheng(int n);
	int n;
	scanf("%d",&n);
	printf("%d",jiecheng(n));
	return 0;
 } 
 int jiecheng(int n)
 {
 	int jieguo; 
	 if(n==0||n==1)
 	jieguo=1;
	 else
	 jieguo=jiecheng(n-1)*n;
	 return(jieguo) ;
 }
这样不行的吗?大佬解答一下
侑理 4年前 回复TA
#include<stdio.h>
double f(int j)
{
    if(j==1)
return 1;
if(j>1)
return j*f(j-1);}

int main()
{
    int a,i;
	double sn=0;
    do{scanf("%d",&a);}while(a>20||a<=0);
    for(i=1;i<=a;i++)
    sn=sn+f(i);
    
    printf("%.0lf\n",sn);
    return 0;
}
为什么错50%  那位大佬可以帮看看吗   实在想不出来了
木头 4年前 回复TA
VC6 编译器, long类型数据长度还是4个字节,存不下
code胡 4年前 回复TA
//定义为long型 防止数组过大出现溢出

#include<iostream>
using namespace std;
long n_jie(int n)
{
	long jiecheng,a;
	a=1;jiecheng=0;
	for(int i=1;i<=n;i++)
	{
		a=a*i;
	}
	return a;
}
int main()
{
	long x,sum;
	sum=0;
	cin>>x;
	for(int i=1;i<=x;i++)
	{
		sum=sum+n_jie(i);
	}
	cout<<sum;
	return 0;
}