首先,我在这里重新发明轮子。我知道在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 = %.9lfn", y, en); this line is for studying when en return 'inf'
}
printf("O valor aproximado de e é aproximadamente %.9lfn", 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;
}
我编译并运行了几次代码,注意到近似值超过了Euler值n=19,en=2.718281835(最后两位应该是28(。对于大于33的n,程序返回en=inf。可能是因为34的阶乘对于我的代码来说已经太大了。
我的问题是:如何利用这段代码背后的思想,制作一个更优化的程序,例如,一个不超过欧拉数值的算法。
我知道,我的代码不是很好,但这是我在没有查阅任何关于如何获得欧拉数的数学书的情况下成功构建的。提前感谢!
如果将此1.0/(fat(y))
存储在变量中,并将其除以递增的y
s,则可以避免完全计算阶乘。
这样,只有当数据类型的精度开始下降时,才应该遇到障碍。
double term = 1.0;
for (y = 1; y <= n; ++y){
term /= y;
en += term; // en = summation(1/fat(y))
}
否则,通常的步骤会有所帮助,使用更宽/更精确的数据类型,如long int
。但我认为这不是你在这里寻找的优化方面。
请尝试以下操作:
#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("Errorn");
exit(1);
}
for (i = 1; i <= n; i++) {
f *= i;
en += 1 / f;
}
printf("n = %d and en = %.9Lfn", n, en);
return 0;
}
它输出n=12:
n = 12 and en = 2.718281828
并且对于较大的n保持相同的CCD_ 4值。