计算数列 1-1/3!+1/5!-1/7!+1/9!-…的和至某项的绝对值小于 1e-5 时为止(该项不累加)(注意精度控制)

计算数列 1-1/3!+1/5!-1/7!+1/9!-…的和至某项的绝对值小于 1e-5 时为止(该项不累加)。(注意精度控制)
三种方法,答案都不一样。第一种是给的答案(答案总错所以有点不敢信)0.6几,第二种是自己写的-0.72几,第三种是网上搜索加自己改编0.78几。
求问哪里错了?正确的怎样的?C语言。

1、#include<stdio.h>
#include<math.h>
void main()
{
float s=1,t=1,i=3;
while(fabs(1/t)>=1e-5)
{
t=-t*(i-1);
s=s+1/t;
i+=2;
}
printf("%.6f",s);
}

2、#include <stdio.h>
#include <math.h>
void main()
{
float sum=0,i=1;
int n;
for (n=1;fabs(1/i)>=1e-5;n=n+2)
{
i=-i*n;
sum=sum+1/i;
}
printf("%.6f",sum);
}

3、#include <stdio.h>

#include <math.h>
int main( )
{
int temp, flag;
double item, sum;
sum=0.0;
flag=1;
temp=1;
item=1;
while(item>=1e-5)
{
sum=sum+flag*item;
flag=-flag;
temp=temp+2;
item=1.0/temp;
}
printf("%.6f\n", sum);
}

第1个回答  2014-02-04

/*

0.841468

Press any key to continue

*/

#include <stdio.h>

double Fact(int n) { // 返回n!
double i,fact = 1;
for(i = 1; i <= n; ++i)
fact *= i;
return fact;
}

void main() {
double s = 0,t = 1,sign = 1;
int i = 1;
while(t >= 1E-5) {
s += sign * t;
++i;
t = 1 / Fact(2 * i - 1);
sign = -sign;
}
printf("%.6lf\n",s);
}

第2个回答  2014-02-04
第一个程序中,按程序的变量定义和题目的意思,t应该依次是1,3,5,7,...的阶乘,但从实际的代码实现上却不是。不仅如此,第二、第三个程序也不是计算出奇整数的阶乘后再取其倒数,所以造成了错误的计算结果。
按第一个程序修改程序清单如下:
#include<stdio.h>
#include<math.h>
void main()
{
float s=0,t=1,i=1;
float h=1,a=1;
while(a>=1e-5)
{
s+=a*h;
h=-h;
t*=++i;
t*=++i;
a=1.0/t;
}
printf("%.6f",s);
}
经上机运行通过,并且其结果应该是0.84...本回答被提问者采纳
相似回答