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... 根据公式求出π的近似值。
(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位有效数字。
展开
 我来答
solidco2
推荐于2016-09-26 · 知道合伙人软件行家
solidco2
知道合伙人软件行家
采纳数:126 获赞数:539

向TA提问 私信TA
展开全部
#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分发的回答,既然你没有追问,我只能通过修改这个回答,慢慢解释一下:

  1. powi函数 是为了不引用庞大的math库,而自己写的一个简单的正整数幂的函数(math库里有double pow(double, double),这个运算过程中不需要小数的幂值,就用循环乘法来实现了。

  2. item函数 是每个项的计算过程,仔细看的话可能会发现,这些项并不是 i=1,2,3,4... 而是 i=1,3,5,7... 这个是为了符合级数的项中的值,都是奇数在做运算。

  3. item里面的那些注释掉的 printf 是故意留下用来观察级数表达式的。由于每一项都是多个数值相乘或除,如1/2x3/4x5/6 其实就是1 * 2 / 3 * 4 ,这些printf可以在计算每一项的时候把整个过程打印出来。

级数的难点其实就是找到项的通用表达式,你的公式已经把表达式写的很清楚了,就看你把它提取成算法了

紫翼魔狼
2015-06-18 · TA获得超过4344个赞
知道大有可为答主
回答量:1413
采纳率:42%
帮助的人:550万
展开全部

  你的公式对么?

#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;
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
孙栎倩
2015-06-18
知道答主
回答量:3
采纳率:0%
帮助的人:3719
展开全部
(2)应该是3.14
追问
是c语言,编程题啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式