计算e值的C程序

C program for calculating the value of e

我被分配了一个 Hw,要求我使用以下系列计算 e 的值:

1 + 1/1! + 1/2! + ...1/n!

必须计算e的值,直到达到n的值(由用户输入)。此外,必须计算 1/n! 的值,直到它的值小于 epsilon(也由用户输入)。

我写了代码,但有些错误是编译器告诉我的,例如关系比较、使用“;”等任何人都可以帮我解决这个错误。先感谢您。

下面是我的代码:

#include<stdio.h>
int factorial (int i)
{
    if (i==0)
        return 1;
    else
        return i*factorial(i-1);
}

int main(void) {

    int i,n;
    float e,ep;

    printf("what is the value of epsilon: ");
    scanf("%f",&ep);

    printf("what is the value of n: ");
    scanf("%d",&n);

    for (i=1; i<=n, i++)
        e= 1+1/factorial(i);

    for(1/fatorial(i)<=ep)
        printf("The value of e for the entered value of epsilon and n:%f",e);

    return 0;
}
  1. 你不是在对级数求和,而是实际上将 e 设置为 1。

  2. 因为你把它设置为 e + 1/factorial(n) 但你的 factorial() returns 一个 int 很可能大于 1,所以除法是整数, 1 除以任何更大的数将得到 0。

  3. 最后一个循环很奇怪。您是指 while 而不是 for 吗?请注意阶乘输入错误。此外,除了一遍又一遍地打印相同的消息之外,循环体中没有完成任何工作。

为了更精确,我会使用 double 而不是 float

for (i=1; i<=n, i++)
    e= 1+1/factorial(i);

这是错误的,你没有添加到 e,你总是在分配最后一个 系列的值,始终为 0(i = 1 除外)。所以你的 e 会 永远是 1.

factorial 是 returns 和 int 的函数。 int 除以 int 是 一个 int 和 C 中的任何 1/x (对于 x > 1,x integer) 为 0. 你要用 1.0 或将至少一个参数转换为 double(或者 float,如果你是 使用花车):

double e = 1; // initializing e

for(i = 1; i <= n; ++i)
    e += 1.0/factorial(i);

Also, the value of 1/n! must be calculated until it's value is smaller than epsilon, also entered by the user.

没看懂什么意思,如果n是用户给定的固定值, 你一直在计算什么?这真的是练习所说的吗?

我的解释是:如果按 n 个步骤 |e_real - e_calculated| > epsilon, 继续递增 n,否则停止。那将是

#include <stdio.h>
#include <math.h>
#include <stdint.h>

uint64_t factorial (uint64_t i)
{
    if (i==0)
        return 1;
    else
        return i*factorial(i-1);
}

int main(void)
{
    int n;
    double e = 1;
    double epsilon;

    printf("what is the value of epsilon: ");
    scanf("%lf", &epsilon);

    printf("what is the value of n: ");
    scanf("%d",&n);

    int i = 1;
    while(1)
    {
        e += 1.0/factorial(i++);

        if(i >= n && (fabs(e - M_E) < epsilon))
            break;
    }

    printf("e: %.20lf, calculated e: %.20lf, error: %.20lf, steps: %d\n", M_E, e, fabs(e-M_E), i);

    return 0;
}

注意:如果您使用的是 GCC,则必须使用 -lm 选项进行编译:

$ gcc e.c -oe -lm