| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2452 人关注过本帖
标题:任意长的整数加法
只看楼主 加入收藏
a18371121175
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2016-12-21
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:9 
任意长的整数加法
任意长的整数加法
问题描述:设计一个程序实现两个任意长的整数的求和运算。
要求:
利用双向循环链表,设计一个实现任意长的整数进行加法运算的演示程序。要求输入和输出每四位一组,组间用逗号隔开。如:1,0000,0000,0000,0000。
要求用devc++5.0
2016-12-21 11:02
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:20 
代码呢?


[fly]存在即是合理[/fly]
2016-12-21 12:05
a18371121175
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2016-12-21
收藏
得分:0 
回复 2楼 azzbcc
#include<stdio.h>
#include<stdlib.h>
//结点的数据结构:
typedef struct jiedian
{
int s;
struct jiedian *next,*prior;
}dian;
//头结点的数据结构:
typedef struct
{
char f;
int l;
dian *zhi;
}head;
//输出函数:
void shuchu(head *ah)
{
dian *a=(dian *)malloc(sizeof(dian));
if(a==NULL)
{
printf("There is no space!");
return;
}
a=ah->zhi->prior;   //从尾结点开始,向前输出
printf("%c",ah->f);
do
{
printf("%d,",a->s);
a=a->prior;
}
while(a->next!=NULL);
    printf("\n  wan");
}
//此函数完成(从后往前的插入式的)双向链表的创建:
int jianbiao(dian *a,int l,head *ah)
{
dian *t,*p,*q;
t=q=p=a;  //用t来记录初始化时的第一个结点,即建完表后的最后一个结点
scanf("%d",&q->s);
while(q->s!=0)
{
ah->zhi=q;
q->next=p;
p->prior=q;
p=q;
l++;
q=(dian *)malloc(sizeof(dian));
if(q==NULL)
{
printf("There is no space!");
return 0;
}
scanf("%d,",&q->s);
}
p->prior=t;    //使第一个结点的prior指向当前的最后一个结点
t->next=NULL;
return l;
}
//次函数完成头结点初始化:
void chushi(head *ah)
{
dian *a=(dian *)malloc(sizeof(dian));
if(a==NULL)
{
printf("There is no space!");
return;
}
a->s=0;
ah->zhi=a;
ah->l=0;
printf("Please input int :\n");
scanf("%c",&ah->f);  //输入第一个结点的数据,即最高位的一个结点的数据
ah->l=jianbiao(a,ah->l,ah);
return;
}
//此函数完成两个链表的相减:
void jian(head *ah,head *bh,head *ch,dian *a,dian *b,dian *c)
{
dian *t;
while(a!=NULL&&b!=NULL)
{
c->next=(dian *)malloc(sizeof(dian));
c->next->s=0;
if(c->s+a->s>=b->s)
c->s=c->s+a->s-b->s;
else
{
c->s=c->s+a->s+10000-b->s;     //实现借位运算
c->next->s--;         
}
ch->l++;
t=c;  
c=c->next;
c->prior=t;
a=a->next;
b=b->next;
}
while(a!=NULL)
{
c->next=(dian *)malloc(sizeof(dian));
c->next->s=0;
if(c->s+a->s>=0)
c->s=c->s+a->s;
else
{
c->s=c->s+a->s+10000;     //实现借位运算
c->next->s--;         
}
ch->l++;
t=c;  
c=c->next;  
c->prior=t;
a=a->next;
}
c=c->prior;
c->next=NULL;
ch->zhi->prior=c;
}
//表长相同的两个链表相减:
void jian1(head *ah,head *bh,head *ch,dian *a,dian *b,dian *c,dian *p,dian *q)
{
dian *t;
while(a!=p->next&&b!=q->next)
{
c->next=(dian *)malloc(sizeof(dian));
c->next->s=0;
if(c->s+a->s>=b->s)
c->s=c->s+a->s-b->s;
else
{
c->s=c->s+a->s+10000-b->s;     //实现借位运算
c->next->s--;
}
ch->l++;
t=c;  
c=c->next;  
c->prior=t;
a=a->next;  
b=b->next;
}
c=c->prior;
c->next=NULL;
ch->zhi->prior=c;
}
//此函数完成链表加法后期的链接:
void lianjie(dian *a,dian *c,head *ch)
{
dian *p;
while(a!=NULL)
{
c->s+=a->s;
ch->l++;
c->next=(dian *)malloc(sizeof(dian));
if(c->next==NULL) { printf("There is no space!"); return; }
c->next->s=0;
if(c->s>9999)
{
c->next->s=1;     //向前进位的实现
c->s-=10000;
}
p=c;  
c=c->next;  
c->prior=p;
a=a->next;
}
if(c->s=1)c->next=NULL;
else
{
c=c->prior;
c->next=NULL;
}
ch->zhi->prior=c;
}
//此函数实现两个链表的求和
void jisuan(head *ah,head *bh,head *ch)
{
int n,i;
dian *p,*q,*a=(dian *)malloc(sizeof(dian)),*b=(dian *)malloc(sizeof(dian)),*c=(dian *)malloc(sizeof(dian));
if(a==NULL||b==NULL||c==NULL) { printf("There is no space!"); return; }
a=ah->zhi;
b=bh->zhi;
ch->zhi=c;
ch->l=0;
c->s=0;
if(ah->f==bh->f)     //两数符号相等时
{
ch->f=ah->f;
do
{
c->s+=a->s+b->s;
ch->l++;
c->next=(dian *)malloc(sizeof(dian));
if(c->next==NULL) { printf("There is no space!"); return; }
c->next->s=0;
if(c->s>9999)
{
c->next->s=1;     //向前进位的实现
c->s-=10000;
}
p=c;  c=c->next;  c->prior=p;
a=a->next;  b=b->next;
}
while(a->next!=NULL&&b->next!=NULL);
if(a->next!=NULL)
lianjie(a,c,ch);
if(b->next!=NULL)
lianjie(b,c,ch);
else
{
if(c->s=1)c->next=NULL;
else
{
c=c->prior;
c->next=NULL;
}
ch->zhi->prior=c;
}

}
else       //两数符号相异时
{
if(ah->l>bh->l)
{
ch->f=ah->f;
jian(ah,bh,ch,a,b,c);
}
if(ah->l<bh->l)
{
ch->f=bh->f;
jian(bh,ah,ch,b,a,c);
}
else    //当两数结点数相等时
{
a=ah->zhi->prior;
b=bh->zhi->prior;
do
{
a=a->prior;
b=b->prior;
}
while(a->s==b->s);     //寻找两数不同的最高结点
p=a;  q=b;
if(a->s>b->s)
{
a=ah->zhi;
b=bh->zhi;
ch->f=ah->f;
jian1(ah,bh,ch,a,b,c,p,q);
}
else
{
a=ah->zhi;
b=bh->zhi;
ch->f=bh->f;
jian1(bh,ah,ch,b,a,c,p,q);
}
}
}
}
void main()
{
head *ah=(head *)malloc(sizeof(head));
if(ah==NULL) { printf("There is no space!"); return; }
chushi(ah);
head *bh=(head *)malloc(sizeof(head));
if(bh==NULL) { printf("There is no space!"); return; }
chushi(bh);
shuchu(ah);
shuchu(bh);
head *ch=(head *)malloc(sizeof(head));   //创建结果链表ch
if(ch==NULL) { printf("There is no space!"); return; }
jisuan(ah,bh,ch);
shuchu(ch);
}
2016-12-21 12:28
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
把你的输入数据给我

输入第一个结点的数据,即最高位的一个结点的数据


不知道啥意思


[fly]存在即是合理[/fly]
2016-12-21 15:19
a18371121175
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2016-12-21
收藏
得分:0 
12,2345,3456,6789
123,3456,4567,6789
2016-12-21 16:20
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
你的数据生成的链表和你想的并不相同

建议先用字符串存储,然后解析到链表中

程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

typedef struct __tag_link
{
    int data;
    struct __tag_link *prec;
    struct __tag_link *next;
} LinkNode, *LinkList;

LinkList createLinkList(char *str)
{
    char *tmp;
    LinkList p, s, head = NULL;

    while (tmp = strsep(&str, ", "))
    {
        if (!strcmp(tmp, "")) continue;
        if (head == NULL)
        {
            p = head = calloc(sizeof(LinkNode), 1);
            p->data = atoi(tmp);
            continue;
        }
        s = calloc(sizeof(LinkNode), 1);
        s->data = atoi(tmp);

        s->prec = p;
        p->next = s;

        p = s;
    }

    return head;
}

void destroyLinkList(LinkList l)
{
    if (l)
    {
        if (l->next) destroyLinkList(l->next);
        free(l);
    }
}

int main()
{
    char str[128] = "123, 4352, 3234 ,2353,2354";

//    fgets(str, 128, stdin);
    LinkList list = createLinkList(str);

    destroyLinkList(list);
    return 0;
}


[此贴子已经被作者于2016-12-21 17:09编辑过]



[fly]存在即是合理[/fly]
2016-12-21 16:40
a18371121175
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2016-12-21
收藏
得分:0 
这个怎么做啊你帮我改一下啊,非常感谢
2016-12-21 16:46
a18371121175
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2016-12-21
收藏
得分:0 
你做一下,截图发给我好不。
2016-12-21 16:47
a18371121175
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2016-12-21
收藏
得分:0 
你发的这个程序有问题
2016-12-22 10:49
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
用了strsep,改成 strtok了
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

typedef struct __tag_link
{
    int data;
    struct __tag_link *prec;
    struct __tag_link *next;
} LinkNode, *LinkList;

LinkList createLinkList(char *str)
{
    char *tmp = strtok(str, ",");
    LinkList p, s, head = NULL;
    
    p = head = calloc(sizeof(LinkNode), 1);
    p->data = atoi(tmp);
    while (tmp = strtok(NULL, ","))
    {
        s = calloc(sizeof(LinkNode), 1);
        s->data = atoi(tmp);

        s->prec = p;
        p->next = s;

        p = s;
    }

    return head;
}

void destroyLinkList(LinkList l)
{
    if (l)
    {
        if (l->next) destroyLinkList(l->next);
        free(l);
    }
}

int main()
{
    char str[128] = "123, 4352, 3234 ,2353,2354";

//    fgets(str, 128, stdin);
    LinkList list = createLinkList(str);

    destroyLinkList(list);
    return 0;
}


[此贴子已经被作者于2016-12-22 14:42编辑过]



[fly]存在即是合理[/fly]
2016-12-22 14:40
快速回复:任意长的整数加法
数据加载中...
 
   



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

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