注册 登录
编程论坛 数据结构与算法

设计一个长整数运算求和问题

zhuang1101 发布于 2013-12-12 13:08, 666 次点击
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//mat97
//以下是双链表的节点结构,每个节点存储一个4位的数,比如1,0031,0056存入链表后就是1,31,56三个节,输出的时候再补0输出!
typedef struct node{
    int n;
    struct node *next;
    struct node *prev;
} node;
node *p;
char num1[1024],num2[1024];
int conv(char *a)
{
    int n=0,i;
    for(i=0;a[i];++i)
    {
        n*=10;
        n+=(a[i]-'0');
    }
    return n;
}
int main()
{
    char c[2];
    int i,f;
    node *q;
    p=(node*)malloc(sizeof(node));
    p->next=p->prev=0;
    q=p;
    num1[0]=num2[0]=',';
    printf("Enter num 1:\n");
    scanf("%s",num1+1);
    for(i=strlen(num1);i>=0;--i)
    {
        if(num1[i]==',')
        {
            num1[i]=0;
            q->next=(node*)malloc(sizeof(node));
            q->next->prev=q;
            q->next->next=0;
            q=q->next;
            q->n=conv(num1+i+1);
        }
    }
    q->next=p;
    p->prev=q;
    printf("Enter op:\n");
    scanf("%s",c);
    *c=*c=='+'?0:1;
    printf("Enter num 2:\n");
    scanf("%s",num2+1);
    q=p;f=0;
    if(!*c) //+
    {
        for(i=strlen(num2);i>=0;--i)
        {
            if(num2[i]==',')
            {
                num2[i]=0;
                if(q->next==p)
                {
                    q->next=(node*)malloc(sizeof(node));
                    q->next->next=p;
                    q->next->prev=q;
                    q->next->n=0;
                    p->prev=q->next;
                }
                q=q->next;
                q->n+=(conv(num2+i+1)+f);
                if(q->n<10000)
                    f=0;
                else
                {
                    f=1;
                    q->n-=10000;
                }
            }
        }
        if(f)
        {
            if(q->next==p)
            {
                q->next=(node*)malloc(sizeof(node));
                q->next->next=p;
                q->next->prev=q;
                q->next->n=1;
            }
            else
            {
                while(q->next!=p)
                {
                    q=q->next;
                    q->n+=1;
                    if(q->n<10000)
                    {
                        f=0;
                        break;
                    }
                    else
                    {
                        q->n=0;
                        f=1;
                    }
                }
                if(f)
                {
                    q->next=(node*)malloc(sizeof(node));
                    q->next->next=p;
                    q->next->prev=q;
                    q->next->n=1;
                }
            }
        }
        printf("%d,",p->prev->n);
        for(q=p->prev->prev;q!=p;q=q->prev)
            printf("%04d,",q->n);
    }
    else //-
    {
        for(i=strlen(num2);i>=0;--i)
        {
            if(num2[i]==',')
            {
                num2[i]=0;
                if(q->next==p)
                {
                    q->next=(node*)malloc(sizeof(node));
                    q->next->next=p;
                    q->next->prev=q;
                    q->next->n=0;
                    p->prev=q->next;
                }
                q=q->next;
                q->n-=(conv(num2+i+1)+f);
                if(q->n>=0)
                    f=0;
                else
                {
                    f=1;
                    q->n+=10000;
                }
            }
        }
        if(f)
        {
            if(q->next==p)
            {
                q->n-=10000;
            }
            else
            {
                while(q->next!=p)
                {
                    q=q->next;
                    q->n-=1;
                    if(q->n>=0)
                    {
                        f=0;
                        break;
                    }
                    else
                    {
                        q->n+=10000;
                        f=1;
                    }
                }
                if(f)
                {
                    q->n-=10000;
                }
            }
        }
        printf("%d,",p->prev->n);
        for(q=p->prev->prev;q!=p;q=q->prev)
            printf("%04d,",q->n);
    }
    return 0;
}
//这是在网上搜的源代码  有错误 但找不到原因  向大神求解
3 回复
#2
yuccn2013-12-16 20:43
你能看懂这些算法吗?
#3
不玩虚的2013-12-18 10:36
看了看,有意思,不过不理解题意
#4
菜鸟学习篇2013-12-18 20:55
你能说明哪里有错误吗?我刚才运行,编译,测试都正常输出 没有问题哦,你遇到了什么问题
1