2

首先,我在这里重新发明轮子。我知道欧拉数在 C 中有一个常数。因为我发现创建科学程序比任何其他类型的问题更容易,所以我使用这些问题来练习并成为一名优秀的开发人员。

/* calculating euler number */

#include <stdio.h>
int fat(int x);
int main(void)

{
    int n; int y; double en = 1.0; //en = euler number
    
    printf("Entre com o valor de n para a aproximação do número de Euler: \n");//prompt
    scanf("%d", &n);//read n
    //n big enough -> aproximation for en is close of real value of euler number
    if (n < 0){ //if the user input a negative value
        printf("Error!\n");
    }
    else {//if the user is not a troll and enter a positive integer
        for (y = 1; y <= n; y++){ 
            en = en + (1.0/(fat(y))); // en = summation(1/fat(y))
            //printf("y = %d and en = %.9lf\n", y, en); this line is for studying when en return 'inf'

        }
        printf("O valor aproximado de e é aproximadamente %.9lf\n", en);//print euler number aproximation
    }
}
int fat(int x){//defining the factorial function
    int factorial = 1;
    int f;
    for (f = 1; f <= x; f++){
        factorial = factorial * f;
    }
    return factorial;
}

我编译并运行了几次代码,我注意到近似值超过了欧拉值 n=19,en=2.718281835(最后两位应该是 28)。对于大于 33 的 n,程序返回 en = inf。可能是因为 34 的阶乘对我的代码来说已经太高了。

我的问题是:如何利用这段代码背后的思想,做出更优化的程序,比如不超过欧拉数的算法

我知道,我的代码不是很好,但它是我设法构建的,除了一本关于如何获得欧拉数的数学书外,没有咨询任何东西。提前致谢!

4

2 回答 2

2

如果您将其存储在一个变量中,您可以避免完全计算阶乘1.0/(fat(y)),并将其除以progressing ys。
这样,您应该只在数据类型的精度开始失败时遇到障碍。

double term = 1.0;
for (y = 1; y <= n; ++y){
    term /= y;
    en += term; // en = summation(1/fat(y))
}

否则,通常的步骤将有助于使用更广泛/更精确的数据类型,例如long int. 但我认为这不是您在这里寻找的优化方面。

于 2022-02-26T07:05:42.327 回答
1

请您尝试以下方法:

#include <stdio.h>
#include <stdlib.h>

int
main()
{
        int i, n;
        long double en = 1.0;   // Euler's number
        long double f = 1.0;    // factorial number

        printf("Enter the value of n to approximate Euler's number: ");
        scanf("%d", &n);

        if (n < 1) {
                printf("Error\n");
                exit(1);
        }

        for (i = 1; i <= n; i++) {
                f *= i;
                en += 1 / f;
        }
        printf("n = %d and en = %.9Lf\n", n, en);

        return 0;
}

它输出 n = 12:

n = 12 and en = 2.718281828

en并为较大的 n保持相同的值。

于 2022-02-26T07:46:47.543 回答