双链表求pi

用幂集展开

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, 10);
    ListCreate(&sum, 10);
    rn.next->data = 2;
    sum.next->data = 2;

    int i;
    DLinkList pr, ps;
    for(i = 1; i < 10; i ++)
    {


        pr = rn.pre, ps = sum.pre;
        int ret = 0, temp;//ret是指进位标志,temp时当前数位的数值
        printf("%d.1\n",i);
        while(pr != &rn)
        {
            temp = (pr->data*i)+ret;
            ret = temp/10;
            pr->data = temp%10;
            pr = pr->pre;
            printf("ret=%d temp=%d   ",ret,temp);
            ListTraverse(&rn);
        }
        printf("\n");
        pr = pr->next;
        //printf("after 1:rn=");ListTraverse(&rn);printf("ret=%d temp=%d\n",ret,temp);
        //printf("ret=%d temp=%d\n",ret,temp);
        //此时的节点指向pr->next
        //此上的操作时将其乘i
        printf("%d.2\n",i);
        while(pr != &rn)
        {
            temp = (ret*10+pr->data);
            ret = temp%(2*i+1);
            pr->data = temp/(2*i+1);
            pr = pr->next;
            printf("ret=%d temp=%d   ",ret,temp);
            ListTraverse(&rn);
        }
//次上操作是除2*n+1
 ret = 0;
        pr = pr->pre;
        //printf("after 2:rn=");ListTraverse(&rn);printf("ret=%d temp=%d\n",ret,temp);
        //ListTraverse(&rn);
        //将r(n)与sum逐位相加
        while(pr != &rn && ps != &sum)
        {
            temp = (ret+pr->data+ps->data);
            ret = temp/10;
            ps->data = temp%10;
            pr = pr->pre;
            ps = ps->pre;
        }
        printf("\n");
        printf("after %d:sum=",i);ListTraverse(&sum);printf("ret=%d temp=%d\n",ret,temp);printf("\n");
    }
    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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值