0

我正在尝试使用一个循环来近似 C 中的欧拉数,该循环在 e 的两个连续值之间的差异小于 0.0000001 时终止。我得到的值是 2.99.. 我尝试设置它,以便在每次迭代时,将 e 与自身的前一个值(保存在 e1 中)进行比较,如果差异大于 0.0000001,它将添加另一个术语 1/( n!)。有什么问题?我是编程新手,因此感谢任何建议/批评。

#include <stdio.h>
int main()
{
    float e1 = 0, e2 = 1;
    int n = 1, nfact; 

    while ((e2 - e1) > 0.0000001)         
    {
        e1 = e2;   
        nfact = 1;
        for (int count = 1; count < n; count++)     
        {
            nfact = n * count;
        }
        n = n + 1;
        e2 = e1 + (1.0 / nfact);
    }   

    printf("Approximated value of e = %f", e2);
    return 0;
}
4

3 回答 3

1

这不是计算数字阶乘的方式:

for (int count = 1; count < n; count++)     
{
   nfact = n * count;
}

请注意,您总是nfact在每次迭代时将 的值分配给n*count,从而消除 的先前值nfact。这段代码相当于:

nfact = n*(n-1);

因为这是 的最后一个值count

我想你想要这个:

nfact = n;
for (int count = n-1; count > 0; count--)     
{
    nfact = nfact * count;
}
于 2014-11-01T21:24:54.100 回答
1
nfact = 1;
for (int count = 1; count < n; count++)     
{
    nfact = n * count;
}

不会计算n!
nfact 每次迭代都会获得一个全新的值。你肯定是说

nfact = 1;
for (int count = 2; count <= n; count++)     
{
    nfact *= count;
}
于 2014-11-01T21:25:28.637 回答
0

这是我使用以下公式估算数学常数 e 值的代码:e = 1 + 1/1!+ 1/2!+ 1/3!+ ....

#include <stdio.h>

int main(void) {

    int n = 0;          /* loop counter for accuracy */
    int accuracy = 10;  /* current n factorial */
    int fact = 1;       /* degree of accuracy */
    double e = 0;       /* current estimated value of e */

/* 循环直到准确度 */

    while (n <= accuracy) {

        if (n == 0) {
            fact *= 1;
        } else {
            fact *= n;
        }
        e += 1.0 / fact;

        ++n;

    }

    printf("e is %f", e);

    return 0;
}
于 2015-09-14T09:28:07.203 回答