【应用】高精度计算PI值(双向链表)

高精度计算PI值

描述

限制使用双向链表作存储结构,请根据用户输入的一个整数(该整数表示精确到小数点后的位数,可能要求精确到小数点后500位),高精度计算PI值。可以利用反三角函数幂级展开式来进行计算:

输入

输入的一个正整数n

输出

输出PI的值,精确到小数点后n位,最后输出一个回车。

输入样例

5

输出样例

3.14159

思路见上篇【应用】高精度计算PI值(list)

#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;
typedef int DataType;

typedef struct DNode
{
    ElemType data;
    struct DNode *pre, *next;
}DNode, *DLinkList;

void ListCreate(DLinkList L, int n)
{
    int i;
    DLinkList p, s;
    p = L;

    L->pre = L->next = L;                           //表为空时,前驱和后继都指向自己

    for(i = 0; i < n; i ++)
    {
        s = (DLinkList)malloc(sizeof(DNode));
        s->data = 0;

        p->next = s;                                //前驱和后继相互连接
        s->pre = p;

        s->next = L;                             //头和尾互指
        L->pre = s;
        p = s;
    }
}

void ListTraverse(DLinkList L)
{
    DLinkList p = L;
    while(p->next != L)
    {
        p = p->next;
        printf("%d", p->data);

    }
    printf("\n");
}

int main()
{
    DNode rn, sum;
    ListCreate(&rn, 500);
    ListCreate(&sum, 500);
    rn.next->data = 2;
    sum.next->data = 2;


    int i;
    DLinkList pr, ps;

    for(i = 1; i < 500; i ++)
    {
        pr = rn.pre, ps = sum.pre;
        int ret = 0, temp;

        while(pr != &rn)
        {
            temp = (pr->data*i)+ret;
            ret = temp/10;
            pr->data = temp%10;
            pr = pr->pre;
        }
//        for(pr = rn.next; pr != &rn; pr = pr->next)
//            printf("%d", pr->data);
//        printf("\n");
        ret = 0;
        pr = pr->next;
        while(pr != &rn)
        {
            temp = (ret*10+pr->data);
            ret = temp%(2*i+1);
            pr->data = temp/(2*i+1);
            pr = pr->next;
        }

        ret = 0;
        pr = pr->pre;
        while(pr != &rn && ps != &sum)
        {
            temp = (ret+pr->data+ps->data);
            ret = temp/10;
            ps->data = temp%10;
            pr = pr->pre;
            ps = ps->pre;
        }

    }
    int n;
    scanf("%d", &n);

    printf("3.");
    ps = ps->next;
    for(ps = ps->next; n; ps = ps->next, n--)
        printf("%d", ps->data);
    printf("\n");
    return 0;
}

你可能感兴趣的:(【应用】高精度计算PI值(双向链表))