c语言输入n的阶乘_c语言基础编程100道

c语言输入n的阶乘_c语言基础编程100道

输出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.7; 解释:sum=1+1/2+1/3=2.7

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); } 

2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/148066.html

(0)
上一篇 2024年 6月 30日 上午9:42
下一篇 2024年 6月 30日

相关推荐

关注微信