2018/11/22实验报告(应用链表及字符串实现大数相加)

高等程序设计
实 验 报 告

2018 年 11 月 19 日
题1:大整数加法运算器
五、问题描述
编写一个基于动态链表的“大整数加法运算器”,来实现任意长度的的两个整数的加法运算。
具体要求:
(1)必须用单链表的形式来存储一个大整数。例如:对于整数135,可以创建一个单链表,该链表包含三个节点,分别用来存储1、3、5这三个数字。考虑到输入整数的长度是任意的(不超过80位),因此为了减少内存空间的浪费,在程序中必须采用动态链表的方法,即每一个链表节点都是根据需要动态创建的;
(2)只考虑两个非负整数的加法,无须考虑负整数的情形;
(3)为了增强程序的可读性,应采用多函数的形式来实现,至少应该包含如下的函数:创建链表(CreateLList)、加法函数(AddLList)、打印链表(DisplayLList)等,以上函数名仅做参考;
(4)提示:由于本题处理的整数长度是任意的,可能会超出long的取值范围,所以应该用字符串的方式来处理输入。
本题的实现不能调用C++标准模板库来实现。
六、分析设计
数据输入:通过getline直接以字符串形式录入,达到大数相加的目的。
运算主要分为两部分
(一)
比对出两个录入数中较大的一个,确认循环次数(从较大数的最后一位开始依次向前循环,直到第一个数
(二)
通过将字符-48得到相应的整形变量并相加完成加法——>进位借助变量t完成进位操作
(三)
struct ki
{
short au;
ki *next;
};定义结构,用于存储所得数据(由于题目要求为大数相加,使用动态链表)
七、输入输出测试
输入:
9999999999
1
输出
10000000000
输入:
888
66666666666666
输出:
66666666667554
八、分析与总结
在本题中运用了动态链表和链表的逆序排列来回收产生的结果,达到了收入不确定总数目的返回值的效果。
并尝试利用了双向链表,进一步优化程序。
附代码及注释

#include<iostream>
#include<string>
using namespace std;
void ex(string *a,string *b)
{
	string temp;
	temp=*a;
	*a=*b;
	*b=temp;
}//交换两个长度不相同的字符串的先后顺序

struct ki
{
short au;
ki *next;
};
ki* create(string a)
{
	ki *head=NULL,*p,*q=NULL;//设置创建链表需要的指针
	for(int i=a.size()-1;i>=0;i--)
	{
		p=new ki;
		p->au=a[i]-48;
		if(head==NULL)
		{
			head=p;
			q=p;
		}
		else
		{
			q->next=p;
			q=p;
		}
	}
	q->next=NULL;
	return(head);
}//将字符串转化为整形存储在链表中的同时,也实现了将个位数排在前端,便于之后加减
ki* add(ki *head1,ki *head2)
{
	ki *p1=head1;
	ki *p2=head2;
	int t=0;//设置中间变量t进行进位操作
	ki *head3=NULL,*p3,*q3=NULL;
	while(p2!=NULL)
	{
		p3=new ki;
		p3->au=p1->au+p2->au+t;
		if(p3->au>=10)p3->au=p3->au-10,t=1;
		else t=0;
		if(head3==NULL)
		{
			head3=p3;
			q3=p3;
		}
		else
		{
			q3->next=p3;
			q3=p3;
		}
		p1=p1->next;
		p2=p2->next;
    }//从个位数开始进行加减
	while(p1!=NULL)
	{
		p3=new ki;
		p3->au=p1->au+t;
		if(p3->au>=10)p3->au-=10,t=1;
		else t=0;
		q3->next=p3;
		q3=p3;
		p1=p1->next;
	}
	q3->next=NULL;
	if(t!=0)cout<<t;
	return(head3);
}
int main()
{
string a,b;
getline(cin,a);
getline(cin,b);
if(a.size()<b.size())ex(&a,&b);
ki *head1=create(a);
ki *head2=create(b);
ki *head3=add(head1,head2);
ki *head4,*p;
while(head3!=NULL)
{
p=head3->next;
head3->next=head4;
head4=head3;
head3=p;
}//反转链表
p=head4;
while(p!=NULL)
{
	cout<<p->au;
	p=p->next;
}//输出部分
return 0;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值