求圆周率pi的近似值

题目描述

用如下公式
在这里插入图片描述
求圆周率PI的近似值,直到发现某一项的绝对值小于10-6为止(该项不累加)。

要求输出的结果总宽度占10位,其中小数部分为8位。

程序中使用浮点型数据时,请定义为双精度double类型。

如果需要计算绝对值,可以使用C语言数学库提供的函数fabs,如求x的绝对值,则为fabs(x).

输入

输出

PI=圆周率的近似值

输出的结果总宽度占10位,其中小数部分为8位。

末尾输出换行。

样例输入

样例输出

PI=3.14159065

关于这一题,我的第一次代码(错误代码!!!)是这样的:

#include 
#include 
int main() {
	double PI, i, n=0, sum=0.0;
	for(i=1.0; ; i++) {
		n = 1/(2*i-1); //第 i 项的值
		sum = sum-pow(-1,i)*n; // i项累加的结果
		PI = sum * 4.0; // PI的值
		if(n <= pow(10,-6)) {
			printf("PI=%10.8f", PI);
			return 0;
		}
	}
	return 0;
}

输出结果为:

PI=3.14159465

和正确结果始终不搭,调试了半天后发现,这个代码多算了一步。当 i 为500000时,n 为1/999999,此时 n > 10-6,所以继续执行 i++;当 i 为
500001时,n 为1/1000001,此时 n < 10-6,所以输出结果,但要注意的是,此时 sum 和 PI 的值又算了一遍,题目的要求是直到发现某一项的绝对值小于10-6为止(该项不累加),所以此程序应把多的一项消掉。

对此我有了第二次尝试(错误代码!!!):

#include 
#include 
int main() {
	double PI, i, n=0, sum=0.0;
	for(i=1.0; ; i++) {
		sum = sum-pow(-1,i)*n;
		n = 1/(2*i-1);
		PI = sum * 4.0;
		if(n <= pow(10,-6)) {
			printf("PI=%10.8f", PI);
			return 0;
		}
	}
	return 0;
}

输出结果为:

PI=-3.14159065

数值对了,但是多了一个负号。将 n 和 sum 换一下顺序后,0成了第一项,1成了第二项,由于第二项的符号为负号,所以应当把符号变更一下。
第三次尝试(正确代码!!!):

#include 
#include 
int main() {
	double PI, i, n=0, sum=0.0;
	for(i=1.0; ; i++) {
		sum = sum-pow(-1,(i+1))*n;
		n = 1/(2*i-1);
		PI = sum * 4.0;
		if(n <= pow(10,-6)) {
			printf("PI=%10.8f", PI);
			return 0;
		}
	}
	return 0;
}

运行结果:

PI=3.14159065

你可能感兴趣的:(算法笔记,C/C++快速入门)