c语言程序设计相关问题

求e =1/1!+1/2!+1/3!+……1/n!,直到最后一项小于10-5为止。
#include<stdio.h>
#include<math.h>
void main()
{

int i = 1, n = 1,m;
double z, e ;
e = 0;
while (1)
{
    for (m= 1; m<= i; m++)
    {
        n = n * m;
    }
    i = i + 1;
    z = 1 / n;
    e = e + z;
    if (z < 0.00001)
    {
        break;
    }
}
printf("%lf", e);

}
这串代码问题在哪?我只是想知道这串代码的问题在哪里,不用重新帮我写新的代码,在这个代码的思路上进行微调就行。

三个问题,用注释标注出来


void main()
{
    int i = 1, n,m; 
    double z, e ;
    e = 1; //初始值设为1,你的e的计算公式有误,前面两项都是1,也即是1/0!和1/1!,1/0!不方便写循环可以直接定为初始值
    while (1)
    {
        n=1; //你的n放置是有错误的,每次循环都需要重置为1,然后运行下面的阶乘
        for (m= 1; m<= i; m++)
        {
            n = n * m;
        }
        i = i + 1;
        z = 1.0 / n; //必须加小数点,否则整数除以整数默认地板除(比如1/2=0)
        e = e + z;
        if (z < 0.00001)
        {
            break;
        }
    }
    printf("%lf", e);
}


#include<stdio.h>
#include<math.h>
int f(int t)//用递归求阶乘的函数
{
  if(t==0)
      return 1;
  else
      return f(t-1)*t;

}

int main()
{
 double sum=0;
  double flag=-1;
  double i=1.0;
  int n=0;
  while(fabs(i)>=1E-5)
  {
     sum+=i;
    //
    i=(flag*1)/f(n);
    //printf("%d的阶层值是%d\n",n,f(n));
    flag=-flag;
    n=n+1;
  }
  printf("之和是%lf\n",sum);
  return 0;
}

e的公式错了,是e =1/0!+1/1!+1/2!+1/3!+…+1/n!


#include <stdio.h>

int main(void) {
    //e =1/1!+1/2!+1/3!+……1/n!
    float fun(int n);

    float gete = 0;
    float per;
    int i = 0;
    do {
        per = 1.0 / fun(i);
        gete += per;
        ++i;
    } while (per >= 10e-5);

    printf("%f\n", gete);

    return 0;
}

float fun(int n)
{
    if (n == 0) return 1;
    else return n * fun(n - 1);
}

img

首先要想结果是小数,中间所有涉及的数都应该变成小数,我也是刚学,无法认识这个问题最根本的解决方法是什么,但只要将中间涉及的所有数变成小数,就能完美避免这个问题。
然后,判断退出语句有些问题,你把break放在了if语句中,无法得到正确的答案,所以可以增加一个判断值,例如flaag=1。这个是我写的程序,算出来应该是正确答案。
#include <stdio.h>
int main()
{
double i = 1, n = 1,m,flag=1;
double z, e ;
e = 0;
while (flag==1)
{
for (m=1;m<=i;m++)
{
n = n * m;
}
i = i + 1;
z = 1 / n;
e = e + z;
if (z < 0.00005)
{
flag=0;
}
else
flag=1;
}
printf("%lf", e);
return 0;
}

设计一个专门计算阶乘的函数,其次封装一个比较最小值的函数,最后计算加和,这样有层次,问题定位不准确就添加打印信息观察每一步的值变化