C 如何修复“的代码”;e=1+;1/1! +;1/2! +;1/3! ++;1/n&引用;?
这就是我想到的:C 如何修复“的代码”;e=1+;1/1! +;1/2! +;1/3! ++;1/n&引用;?,c,C,这就是我想到的: #include <stdio.h> int main (void) { int n, i, j; float e = 1.0, nFact = 1.0; printf ("please enter the number"); scanf ("%d", &n); for (i = 1; i <= n ; i++) { for (j = 1; j <= i; j++) { nFact *=
#include <stdio.h>
int main (void)
{
int n, i, j;
float e = 1.0, nFact = 1.0;
printf ("please enter the number");
scanf ("%d", &n);
for (i = 1; i <= n ; i++)
{
for (j = 1; j <= i; j++)
{
nFact *= j;
}
e = e + (1.0 / nFact);
}
printf ("The value of 'e' is : %f", e);
return 0;
}
#包括
内部主(空)
{
int n,i,j;
浮点数e=1.0,nFact=1.0;
printf(“请输入号码”);
scanf(“%d”和“&n”);
对于(i=1;i我在这里做错了什么吗?
您忘记了将阶乘变量设置为1。因此,您的变量正在迅速变小。这使得(1.0/nFact)变得更小,这就是为什么您得到更小的e
nFact=1.0; //add this line so it resets to 1.0 everytime a factorial is needed
for( j = 1 ; j <= i; j++)
{
nFact *= j;
e = e + (1.0/ nFact);
}
//only single loop is more than enough
nFact=1.0;//添加此行,使其在每次需要阶乘时重置为1.0
对于(j=1;j)不需要阶乘循环。只需使用旧值,因为您没有重置它。(只需乘以i)
如何获得正确的输出?
在第11次或第12次迭代后,您的float
将无法提供足够的精度分辨率最小步长。Double
或BıgDecimal
如果您选择科学,似乎会更好。您在每次迭代中都不必要地计算阶乘。只需将内环替换为nFact*=i;
#include<stdio.h>
int main (void)
{
int n,i,j;
float e=1.0, nFact=1;
printf("please enter the number");
scanf("%d", &n);
for( i =1; i<= n ; i++)
{
nFact*=i;
e = e + (1.0/ nFact);
}
printf("The value of 'e' is : %f", e);
return 0;
}
#包括
内部主(空)
{
int n,i,j;
浮点数e=1.0,nFact=1;
printf(“请输入号码”);
scanf(“%d”和“&n”);
对于(i=1;i,该循环效率非常低:请注意,您的内部循环是如何反复计算相同的内容的
相反,您应该保留一个正在运行的术语并对其进行更新:
double term = 1;
double result = term;
for (unsigned int i = 1; i != n; ++i)
{
term /= i;
result += term;
}
printf("With %u steps we compute %f.\n", n, result);
我不确定在C:)中是否有std::cout
,在数学中e被定义为极限(1+1/n)^n,所以只需在公式中加入大数字,而不用计算大的阶乘