zhyin 发表于 2016-4-13 13:52:25

C语言求e的近似值

题目:用e≈1+1/1!+1/2!+1/3!+...+1/n!求e得近似值,直到最后一项的绝对值小于10负六次方。
求大神指导指导,我打的代码编译组建时都没错,但运行时没反应。

#include <stdio.h>
#include <math.h>
int main ()
{   
      int n=1;
      float sum=1,term=1,a;   //sum开始代表多项式的值,最后代表e的近似值,term代表当前项的值
      
      while (fabs(term)>=1e-6)
      {   n++;
                term=1/(term*n);
                sum=sum+term;
      }
      printf ("e=%10.8f\n",sum);
      return 0;
}

mingcxx 发表于 2016-4-13 15:16:59

本帖最后由 mingcxx 于 2016-4-13 15:53 编辑

问题原因:语句" term=1/(term*n);”有问题:(n++位置也有问题)
它的作用是:取前一项M,乘以当前n, 再取倒数为当前项, 等于1/(M*n),把前一项套在了当前项的分母,当前项错误,累加也就错了,回到循环首,错误的当前项大于1e-6,继续循环,依次往后,每一项的分母套上了前一项,无限循环......
解决方法:声明一个变量保存当前项的分母,分母不断取阶乘、取倒数得到当前项,再把当前项累加起来,{:5_108:} 注意n++位置,在循环体最后。
#include <stdio.h>
#include <math.h>
int main(void)
{
        int n = 1;
        float sum = 1, term = 1, term_monther = 1;   //那个a利用上,保存分母

        //从第二项开始
        while (fabs(term) >= 1e-6)
        {
                term_monther *= n;                                        //分母累乘
                term = 1 / term_monther;                                //当前项
                sum += term;                                                        //当前项加到sum里
                n++;
        }

        printf("e=%10.8f\n", sum);
        return 0;
}

zhyin 发表于 2016-4-13 18:52:13

mingcxx 发表于 2016-4-13 15:16
问题原因:语句" term=1/(term*n);”有问题:(n++位置也有问题)
它的作用是:取前一项M,乘以当前n, 再取 ...

哦哦,这样啊。一开始还以为term_monther *= n;term = 1 / term_monther;这两条语句合起来就是我打错这个term=1/(term*n) ,谢谢啦{:10_254:}

mingcxx 发表于 2016-4-13 18:54:03

zhyin 发表于 2016-4-13 18:52
哦哦,这样啊。一开始还以为term_monther *= n;term = 1 / term_monther;这两条语句合起来就是我打错这个 ...

么事么事,清楚了就好{:5_109:}
页: [1]
查看完整版本: C语言求e的近似值