利用C语言输出n阶分式的阶乘之和

输出n阶分式阶乘之和

1.0 题目

用户输入一个数字时,会输出累加项1+1/n!的值,即sum=1+1/1!+1/2!+…+1/n!;并将小数精度保持为12位。

2.0 示例

实例 1:
输入:n=1;
输出:2.000000000000;
解释:sum=1+1/1=2.000000000000
实例 2:
输入:n=3;
输出:2.666666666667;
解释:sum=1+1/2+1/3=2.666666666667

3.0 题目分析

  1. 对于求阶乘需要我们用一个循环来输出,而累加又需要一个循环,则这个程序需要用嵌套循环来输出,可以用for循环实现。
  2. 对于累加需要一个变量来存放值,对于阶乘也需要一个变量来存放值,所以需要定义两个变量来存放不同数值。
  3. 对于题目要求小数精度要求十二位,我们可以将sum定义为double型,而且输出结果时,输出为%.12f,即可。
  4. 对于阶乘的运算,可以在循环中令每个数相乘并输出相乘的结果。

4.0 程序

#include<stdio.h>
int main()
{
	int i,j,n;
	double sum=1;
	printf("请输入n:\n");
	scanf("%d",&n);
	for(i=1;i<=n;i++){
	double	fac=1;
		for(j=1;j<=i;j++){
		fac=fac*j;	
		}

		sum = sum+1/fac;
	}
	printf("当n为%d时,结果:sum=%.12f\n",n,sum);
	
} 
  1. 程序运行如下

在这里插入图片描述

5.0 程序详解

  1. 对于定义变量,我们可以将i,j设为int型变量,而对于sum和定义的阶乘结果,我们定义为double型,而且sum开头为1+1/!,故初始值赋值为1,因为输出的为小数形式,故sum需要定义为double型,而其实fac也可以定义为int型,下面会讲解,先不解释。
  2. 对于第一个for循环for(i=1;i<=n;i++)就很容易理解,因为我们需要输出等于n时的值,故需要小于等于n。而for下面的double fac=1;之所以不在循环外定义是因为我们每次在i循环一次之后进行j循环都需要令fac=1,这样才能使阶乘从1到n依次相乘。
  3. 对于for(j=1;j<=i;j++),小于等于i是因为i进行累加,每个阶乘只需要等于它累加的那一项n大小。而fac=fac*j;是为了将fac从1乘到i的值。
  4. sum = sum+1/fac;对于每次j循环执行完之后得到1/j!然后加到sum中,一直加到1/n!。而上面说之所以能将fac定义为int型,是可以将1/fac写成1.0/fac的形式,1.0/fac会将fac直接转换成double形式,这样得到的结果也跟原式一样,所以用这两种方式都一样。

6.0 问题

在小编写程序时遇到一个问题,就是当把fac定义在循环外部时,但是在j循环中将fac==1,强制将fac赋值为1,但是发现没有用,还是跟没有强制赋值一样,代码如下:

#include<stdio.h>
int main()
{
	int i,j,n;
	double sum=1;
	printf("请输入n\n");
	scanf("%d",&n);
	double	fac=1;
	for(i=1;i<=n;i++){
		for(j=1;j<=i;j++){
			fac==1;
		fac=fac*j;	
		}

		sum = sum+1.0/fac;
	}
	printf("当n为%d时,结果:sum=%.12f\n",n,sum);
	
} 

其中程序运行图为

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uYKjj0l9-1650035144251)(D:\图片\阶乘分式错误图.png)]

很明显结果与上面结果不一样,结果小了一些。然后输出fac,i,j每次变量之后会发现:

在这里插入图片描述
在这里插入图片描述

发现本来标的2中应该fac应该跟1一样在j开始新一次都为1,但是却为2.很明显是上面循环的fac为2没有清除掉。但是一直没有找到原因,希望有大佬能帮忙解惑一下。代码如下:

#include<stdio.h>
int main()
{
	int i,j,n;
	double sum=1;
	printf("请输入n\n");
	scanf("%d",&n);
	double	fac=1;
	for(i=1;i<=n;i++){
	//double	fac=1;
		for(j=1;j<=i;j++){
			fac==1;
		fac=fac*j;
		printf("i=%d\n",i);
		printf("j=%d\n",j);
		printf("fac=%f\n",fac);
		}

		sum = sum+1.0/fac;
	}
	printf("当n为%d时,结果:sum=%.12f\n",n,sum);
	
} 
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丶丶丶丶。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值