| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2546 人关注过本帖
标题:任意长整数的加法
只看楼主 加入收藏
a18371121175
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2016-12-21
结帖率:50%
收藏
 问题点数:0 回复次数:1 
任意长整数的加法
问题描述:设计一个程序实现两个任意长的整数的求和运算。
要求:
利用双向循环链表,设计一个实现任意长的整数进行加法运算的演示程序。要求输入和输出每四位一组,组间用逗号隔开。如:1,0000,0000,0000,0000。
用C语言实现
#include <stdio.h>
#include <stdlib.h>
typedef struct Node{
    int data;
    struct Node *prior;
    struct Node *next;
}LNode,*LinkList;
void InitLink(LinkList *L)
{
    *L=(LinkList)malloc(sizeof(LNode));
    (*L)->prior=*L;
    (*L)->next=*L;
}
void Delete(LinkList L)
{
    LinkList p=L->next;
    LinkList temp;
    while(p!=L)
    {
       temp=p;
       p->next;
       free(temp);
    }
    L->next=L;
    L->prior=L;
}
void Append(LinkList L,int s)
{
    LinkList p=L;
    LinkList temp=(LinkList)malloc(sizeof(LNode));
    temp->next=L;
    temp->data=s;
    temp->prior=L->prior;
    L->prior->next=temp;
    L->prior=temp;
}
void Output(LinkList L)
{
    LinkList p=L->next;
    if(p==L)
    {
        printf("0");
        return;
    }
    if(L->data==-1)
    printf("-");
    printf("%d",p->data);
    p=p->next;
    while(p!=L)
    {
        printf(",%04d",p->data);
        p=p->next;
    }
}
void Output2(LinkList L)
{
    LinkList p=L->prior;
    if(p==L)
    {
        printf("0");
        return;
    }
    if(L->data==-1)
    printf("-");
    printf("%d",p->data);
    p=p->prior;
    while(p!=L)
    {
        printf(",%04d",p->data);
        p=p->prior;
    }
}
void Sum_Linksum(LinkList A,LinkList B,LinkList C)
{
    LinkList a=A->prior;
    LinkList b=B->prior;
    int sum;
    int carry=0;
    C->data=1;
    if(A->data<0)
    C->data=-1;
    while(a!=A&&b!=B)
    {
        sum=a->data+b->data+carry;
        carry=sum/10000;
        Append(C,sum%10000);
        a=a->prior;
        b=b->prior;
    }
    while(a!=A)
    {
       sum=a->data+carry;
       carry=sum/10000;
       Append(C,sum%10000);
       a=a->prior;
    }
    while(b!=B)
    {
       sum=b->data+carry;
       carry=sum/10000;
       Append(C,sum%10000);
       b=b->prior;
    }
    if(carry)Append(C,carry);
}
void DelZero(LinkList L)
{
    LinkList p=L;
    LinkList q;
    while(p->prior!=L)
    {
        if(p->prior->data!=0)
        break;
        else
        {
            q=p->prior;
            p->prior=q->prior;
            q->prior->next=p;
            free(q);
        }
    }
   
}
void Sub_Linknum(LinkList A,LinkList B,LinkList C)
{
    LinkList HA=A;
    LinkList HB=B;
    LinkList a=HA->prior;
    LinkList b=HB->prior;
    int sub;
    int borrow=0;
    int flag=0;
    C->data=1;
    while(a!=HA&&b!=HB)
    {
        if(a->data<b->data) flag=1;
        if(a->data>b->data) flag=0;
        a=a->prior;
        b=b->prior;
    }
    if(b!=HB) flag=1;
    if(a!=HA) flag=0;
    if(flag==1)
    {
        HA=B;
        HB=a;
        C->data=-1;
    }
    a=HA->prior;
    b=HB->prior;
    while(b!=HB){
    sub=a->data-borrow-b->data;
    if(sub>=0)
    borrow=0;
    else
    {
        borrow=1;
        sub+=10000;
    }
    Append(C,sub);
    a=a->prior;
    b=b->prior;
}
while(a!=HA){
sub=a->data-borrow;
if(sub>=0)
borrow=0;
else
{
    borrow=1;
    sub+=10000;
}
Append(C,sub);
a=a->prior;
}
DelZero(C);
}
int main()
{
   
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    int i,k;
    int dex=0,flag=0;
    char ch;
    LinkList num[3];
    printf("\nplease input Number:\n");
    for(i=0;i<3;i++)
    InitLink(&num[i]);
    while(scanf("%d",&k)!=EOF)
    {
        if(flag==0)
        {
            if(k<0)
            {
                num[dex]->data=-1;
                k*=-1;
            }
            else if(k>0)
            num[dex]->data=1;
            else
            num[dex]->data=0;
            flag=1;
        }
        ch=getchar();
        Append(num[dex],k);
        if(ch!=',')
        {
            if(dex==1)
            {
                if(num[0]->data==0&&num[1]->data==0)
                break;
                Output(num[0]);
                printf("+");
                Output(num[1]);
                printf("=");
                if(num[0]->data==num[1]->data)
                Sum_Linknum(num[0],num[1],num[2]);
                else if(num[0]->data>0)
                Sub_Linknum(num[0],num[1],num[2]);
                else
                Sub_Linknum(num[0],num[1],num[2]);
                Output(num[2]);
                puts("");
                for(i=0;i<3;i++)
                Delete(num[i]);            
            }
            flag=0;
            dex=!dex;
        }
    }
    system("pause");
    return 0;
}
这个代码错在哪里,怎么运行不出来,求大神帮忙!
搜索更多相关主题的帖子: include C语言 
2016-12-29 15:42
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
代码有些长没耐心去看,直接测试了一组数据结合你的文字说明做猜测:

1.双向链表就行了,何必循环?循环起来程序不就跑得没玩没了?
2.“每四位一组,组间用逗号分隔”,请问测试1+1的结果你是不是打算输出“,0002”?我看程序的意思是要输出“2”的吧,只有超过4位数了才需要逗号,但最高位也并不一定非得用零补齐4位
3.编译都通不过。。。
图片附件: 游客没有浏览图片的权限,请 登录注册

4.1+1=2     还用程序运行到这就进入无限循环了。。
图片附件: 游客没有浏览图片的权限,请 登录注册

5.还有一个坑,“负数”怎么处理...

φ(゜▽゜*)♪
2017-01-13 09:58
快速回复:任意长整数的加法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017794 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved