Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何修复“的代码”;e=1+;1/1! +;1/2! +;1/3! ++;1/n&引用;?_C - Fatal编程技术网

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,所以只需在公式中加入大数字,而不用计算大的阶乘