c语言 根据公式求出π的近似值。
(2)功能要求
①公式
π/6=1/2+(1/2)×1/3×(1/2)3+(1/2×3/4)×1/5×(1/2)5+(1/2×3/4×5/6)×1/7×(1/2)7...
②编程求π的近似值,当数列的最后一项小于10的-6次方为止。
③输出π值,小数点后保留6位有效数字。 展开
#include<stdio.h>
double powi(double num, int multi) {
double r = 1.0;
int i;
for (i = 0; i < multi; i++) {
r *= num;
}
return r;
}
double item(int n) {
double r = 1.0;
int i;
/* 1.0 * 1 / 2 * 3 / 4 * 5 / 6 ..... */
for (i = 1; i < n; i++) {
if (i % 2) {
r *= i;
/* printf("*%d", i); */
} else {
r /= i;
/* printf("/%d", i); */
}
}
r *= 1;
/* printf("*%d", 1); */
r /= n;
/* printf("/%d", n); */
r *= powi(0.5, n);
/* printf("*%lf", powi(0.5, n)); */
/* printf(" -- item %d: %lf \n", n, r); */
return r;
}
int main() {
double pd6 = 0.0, ci = 0.0;
int i = 1;
do {
ci = item(i);
pd6 += ci;
i += 2;
} while (ci >= 1e-6);
printf("PI=%.6lf\n", pd6 * 6);
return 0;
}
完全按你的公式做的,结果真的对了,3.141592(这里对6位有效数字有个存疑,就是应该输出6位还是7位数字,理论上有效数字后面应该带上一个估值,用来修正有效数字的,如果要求真的那么严格,我可以给你写个函数用来输出6位有效数字)。
一般级数很少有用这个复杂的式子的吧,一般都是 1-1/3+1/5-1/7+1/9-1/11 这个式子,你的公式竟然也是对的。楼上的完全没看懂级数的项的规律。
-------------------------------------------------
以上是20:29分发的回答,既然你没有追问,我只能通过修改这个回答,慢慢解释一下:
powi函数 是为了不引用庞大的math库,而自己写的一个简单的正整数幂的函数(math库里有double pow(double, double),这个运算过程中不需要小数的幂值,就用循环乘法来实现了。
item函数 是每个项的计算过程,仔细看的话可能会发现,这些项并不是 i=1,2,3,4... 而是 i=1,3,5,7... 这个是为了符合级数的项中的值,都是奇数在做运算。
item里面的那些注释掉的 printf 是故意留下用来观察级数表达式的。由于每一项都是多个数值相乘或除,如1/2x3/4x5/6 其实就是1 * 2 / 3 * 4 ,这些printf可以在计算每一项的时候把整个过程打印出来。
级数的难点其实就是找到项的通用表达式,你的公式已经把表达式写的很清楚了,就看你把它提取成算法了
你的公式对么?
#include <stdio.h>
int main()
{
double temp = 2, PI = 2, delta = 10.0e-6;
double a = 1.0, b = 3.0; //a为分子,b为分母
while (temp > delta)
{
temp *= a / b;
PI += temp;
a += 1.0;
b += 2.0;
}
printf("PI = %.6f",PI);
return 0;
}
是c语言,编程题啊