标题:[原创]长整数的加减运算
取消只看楼主
starrysky
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
 问题点数:0 回复次数:4 
[原创]长整数的加减运算

Typedef struct node {

int data1; //存储系数 0<=data1<=9

unsigned long int data2; // 存储指数0~232-1

struct node *next;

struct node *pre;

}// node, *DuLinkList ;

status CreatList(DuLinkList &L) //长整数的输入与存储

{ char c[];

gets(c);//将长整数以字符串的形式输入

p=L . head; if (a[0]='-' or a[0]='+') { if(a[0]='-') L.head->data1=-1 ;//如果长整数为负,在链表头结点中标记为-1 else L.head->data1=1;//如果长整数为正,在链表头结点中标记为1 for (i=0; a[i]!=''; i++) a[i]= a[i+1]; }

else L.head->data1=1;//如果长整数为正,在链表头结点中标记为1

for(i=0 ; i<strlen(c) ; i++) //从数组转入链表并转化数据类型

{

if(a[i]>' 9 ' or a[i]< ' 0 ') exit ( ERROR INPUT);//出错处理

f(a[i]= ' 0 ') ;//如果当前数位上的数值为0, 则不建立该结点

else

{

r=(node *)malloc(sizeof (node));//分配空间

if(! r) exit (OVERFLOW);//分配失败,则出错

r->data1=a[i]-' 0 '; //数据类型转化 char to int

r->data2= strlen(c)-1-i;

p->next= r; r->pre =p;

p=r;

}

} free(c); //删除数组c return OK;

}// CreatList

void DeletCurElem(*p)//删除当前结点 { h=p->pre; h->next=p->next; p->next->pre=h; free(p); p=h->next; h=NULL; }

void JudgeCurElem(*q) //出理当前数位的进位退位 { h=q->pre; if(q->data1>9) { q->data1-=10; h->data1+=1; JudgeCurElem(h); if(q->data1=0) DeletCurElem(q); q=q->next; } if(0<q->data1<=9) q=q->next; if(q->data1=0) DeletCurElem(q); if(q->data1<0) { q->data1+=10; h->data1-=1; build(h,q);//建立h和p之间的结点 if(h->data1=0) DeletCurElem(h); q=q->next; } h=NULL; }

void build(*p, *q) { t=p; i=p->data2-q->data2-1; for(;i>0;i--)//分配i个空间 { r=(node *)malloc(sizeof (node)); if(! r) exit (OVERFLOW);//分配失败,则出错 r->data1= 9;

r->data2= q->data2+i;

t->next= r; r->pre =t;

t=r;

} t->next=q ; q->pre=t; t=NULL }

void output(DuLinkList &L) //输出函数 { printf("计算结果为:"); p=L.head->next; if(!p) //计算结果为0 printf("0"); else { if L.head->data1=-1 printf("-"); //如果为负数则输出负号 while(p) { printf("%d",p->data1); // 补充为0的数位 if(p->next) { p->data2-- ; while(p->data2!=p->next->data2) { printf("0"); p->data2--; } } if(!p->next&&p->data2!=0) while( p->data2!=0) { printf("0"); p->data2-- ; } p=p->next; } } }

void main() { InitList(La); InitList(Lb); printf(“请输入第一个长整数”); CreatList(La); printf(“请输入第二个长整数”); CreatList(Lb); printf(“请输入运算符”); c=getchar(); if( c= '+ '); if( c= '- ') Lb.head->data1*=-1; else exit(ERROR INPUT); a=La.head->data1; b=Lb.head->data1; qa=La.head->next; qb=Lb.head->next; while(qa and qb) //合并La, Lb { ha=qa->pre; hb=qb->pre; if(qa->data2>qb->data2) qa=qa->next;

if(qa->data2=qb->data2) { qa->data1=(qa->data1*a+qb->data1*b)/a; DeletCurElem(qb); }

if(qa->data2<qb->data2) //将qb插入到qa之前 { qb->data1=qb->data1*b/a; //将qb内数据转换为qa内数据 ha->next=qb; qb->pre=ha; hb->next=qb->next; qb->next=qa; qa->pre=qb; qb=hb->next; } }

if(!ListEmpty(Lb))//Lb 不为空时将其插入到La末尾 { ha->next=qb; qb->pre=ha; qa=ha->next; // qa=qb Lb.head->next=NULL; hb=NULL; while (qa) { qa->data1=qa->data1*b/a; //将qb内数据转换为qa内数据 } qb=NULL; free(Lb.head); } p=La.head->next; if(p->data1<0) { La.head->data1*=-1; while(p) {p->data1*=-1;p=p->next;} } p=La.head->next; while(p) JudgeCurElem(p);//重新遍历La, 进行进位退位处理 output(La); } 上面的算法为长整数的加法和减法运算, 稍微修改一下就可以上机调试.

搜索更多相关主题的帖子: 整数 node 运算 struct SUP 
2005-09-24 16:22
starrysky
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
得分:0 
改一下定义的结构和部分语句就可以变成象

Typedef struct node {

int data1; //存储万以内的整数 -10000<data1<10000

unsigned int data2; // 存储指数,1 表示10000,2表示 100002,3表示100003,...

struct node *next;

struct node *pre;

}// node, *DuLinkList 这样的结构, 就是某些人的数据结构作业.我就不改了


我的征途是星辰大海
2005-09-24 16:25
starrysky
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
得分:0 
2:题目:长整数四则运算。
问题描述:设计一个实现任意长的整数进行加法运算的演示程序。
基本要求:利用双向循环链表实现长整数的存储,每个结点含一个整形变量。任何整形变量的范围是 -(2^15 - 1)~ (2^15 - 1)。输入和输出形式:按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。
测试数据:
(1)0;0;应输出“0”。
(2)-2345,6789;-7654,3211;应输出“-1,0000,0000”。
(3)-9999,9999;1,0000,0000,0000;应输出“9999,0000,0001”。
(4)1,0001,0001;-1,0001,0001;应输出“0”。
*****************************************************
这个题目可用楼主的算法完成, 但用第2楼的结构比较好.

我的征途是星辰大海
2005-09-24 16:42
starrysky
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
得分:0 
如果有问题 , 请不吝赐教

我的征途是星辰大海
2005-09-24 17:08
starrysky
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
得分:0 
,这么早的帖子也给你翻出来了啊.
谢谢给出代码
可惜我学的是C,C++的看不大明白
我可是C++菜鸟级人物

[此贴子已经被作者于2006-6-3 17:41:28编辑过]


我的征途是星辰大海
2006-06-03 17:31



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-28583-1-1.html




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

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