用链表实现大数相加减

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《高级语言程序设计》作业报告

作业名称: 大整数相加减

学院计算机科学与工程学院

专业计算机软件

学生姓名 awell

任课教师 xxx

提交日期

一、问题描述

实现两个大整数的相加减

二、系统设计

1、结构说明

建立结构类型 node:

struct node{

int num;//每个位数用一个int类型表示,其中num>=0&&num<=9;

node * next;//建立单向链表,连接相邻的数字;

};

2、函数说明

建立链表(将输入的两个数中较大的保存在fir表头的链表中):

void creatlist(){

bool falg=false;//标记输入的两个整数是否需要进行互换;

if()-falg1>()-falg2)//falg1表示输入的第一个整数前面的符号;

falg=true;

if()-falg2==()-falg1){

for(int i=0;i<()-falg2;i++){

if(opration=='+') {//如果是实现加法,不用管建链表时的整数互换falg=true;

break;

}

if(arr1[i+falg1]>arr2[i+falg2]) {

falg=true;

break;

}

if(i==()-falg1-1) falg=false;

}

}

if(falg)

{

for(int i=()-1;i>=falg1;i--){

node *s;

s=new node;

s->num=arr1[i]-'0';//从输入的整数尾部逆向建立链表

if(fir==NULL) fir=s;

else efir->next=s;

efir=s;

}

efir->next=NULL;//尾结点的next一定要赋NULL,不然会出现错误

for(int i=()-1;i>=falg2;i--){

node *s;

s=new node;

s->num=arr2[i]-'0';

if(sec==NULL) sec=s;

else esec->next=s;

esec=s;

}

esec->next=NULL;

}

else{

for(int i=()-1;i>=falg2;i--){

node *s;

s=new node;

s->num=arr2[i]-'0';

if(fir==NULL) fir=s;

else efir->next=s;

efir=s;

}

efir->next=NULL;

for(int i=()-1;i>=falg1;i--){

node *s;

s=new node;

s->num=arr1[i]-'0';

if(sec==NULL) sec=s;

else esec->next=s;

esec=s;

}

esec->next=NULL;

}

if(opration=='+') return;

if(!falg) f=!f;//f表示整个运算结果的正负

}

void add(){//实现加法

bool falg=false;//标记是否进位

int num2=sec->num;

for(node *head1=fir,*head2=sec;head1;head1=head1->next){//因为以fir为表头建立的链表所保存的整数较大,所以,以sec为表头建立的链表会先或者同时遍历到表位int num1=head1->num;

head1->num=(falg+num1+num2)%10;

falg=(falg+num1+num2)/10;

if(head2->next) {//判断以sec为表头的链表是否达到表尾

head2=head2->next;

num2=head2->num;

}

else num2=0;

}

if(f) cout<<"-";

if(falg) cout<<1;

int i=0;

char *ans=new char[sizeof(arr1)+sizeof(arr2)];

for(node *head1=fir;head1;head1=head1->next){

ans[i]=head1->num+'0';

i++;

}

for(i--;i>=0;i--)

cout<

}

void sub(){//实现两整数相减

int num2=sec->num;

bool falg=false;//判是否退位

for(node *head1=fir,*head2=sec;head1;head1=head1->next){

int num1=head1->num;

head1->num=num1-num2-falg;

if(num1-falg-num2<0){

falg=true;

head1->num=head1->num+10;

}

else falg=false;

if(head2->next){

head2=head2->next;

num2=head2->num;

}

else num2=0;

}

int i=0;

char *ans=new char[sizeof(arr1)+sizeof(arr2)];

for(node *head1=fir;head1;head1=head1->next){

ans[i]=head1->num+'0';

i++;

}

i--;

falg=false;

for(int j=0;j<=i;j++){

if(ans[j]!='0') break;

if(j==i){

falg=true;

cout<<0;

return;

}

}

if(f) cout<<"-";

if(ans[i]=='0') i--;

相关文档
最新文档