用链表实现大数相加减
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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--;