C++用顺序表实现两个大整数求和

来自大二上学期实验报告1,请多指教。
一、实验任务:
用顺序表实现两个大整数求和
二、代码:

#include<iostream>
using namespace std;
const int MaxSize = 100;
template<class DataType>
class SeqList {
public:
	SeqList() { length = 0; }
	SeqList(DataType array[], int n);
	~SeqList() {}
	int GetLength() { return length; }
	DataType GetElement(int i);
	int GetLocal(DataType x);
	void Insert(int i, DataType x);
	DataType Delete(int i);
	void PrintSeqList();
private:
	DataType data[MaxSize];
	int length;
};

template<class DataType>
SeqList<DataType>::SeqList(DataType array[], int n)
{
	if (n > MaxSize)
	{
		throw "传入的顺序表长度过长";
	}
	for (int i = 0; i < n; i++)
	{
		data[i] = array[i];
	}
	length = n;
}
template<class DataType>
DataType SeqList<DataType>::GetElement(int i)
{
	if (i < 1 || i >length)
	{
		throw "位置有误";
	}
	else
	{
		return data[i - 1];
	}
}
template<class DataType>
int SeqList<DataType>::GetLocal(DataType x)
{
	for (int i = 0; i < length; i++)
	{
		if (data[i] == x)
		{
			return (i + 1);
		}
	}
	return 0;
}
template<class DataType>
void SeqList<DataType>::Insert(int index, DataType x)
{
	if (length >= MaxSize)
	{
		throw "顺序表已存放满";
	}
	if (index<1 || index>length + 1)
	{
		throw "插入元素的位置有误";
	}
	for (int j = length; j >= index; j--)
	{
		data[j] = data[j - 1];
	}
	data[index - 1] = x;
	length++;
}
template<class DataType>
DataType SeqList<DataType>::Delete(int index)
{
	DataType x;
	if (index<1 || index>length)
	{
		throw "删除的位置有误";
	}
	else
	{
		x = data[index - 1];
		for (int i = index; i < length; i++)
		{
			data[i - 1] = data[i];
		}
		length--;
	}
	return x;
}
template<class DataType>
void SeqList<DataType>::PrintSeqList()
{
	if (length < 1)
	{
		throw "顺序表中没有元素";
	}
	else
	{
		for (int i = 0; i < length; i++)
		{
			cout << data[i] << " ";
		}
		cout << endl;
	}
}
SeqList<int> Add(SeqList<int>a, SeqList<int>b)
{
	SeqList<int> c = SeqList<int>();
	int flag = 0, i = 0;
	int aLength = a.GetLength();
	int bLength = b.GetLength();
	while (i < aLength && i < bLength)
	{
		c.Insert(i + 1, (a.GetElement(i + 1) + b.GetElement(i + 1) + flag) % 10);
		flag = (a.GetElement(i + 1) + b.GetElement(i + 1) + flag) / 10;
		i++;
	}
	for (; i < aLength; i++)
	{
		c.Insert(i + 1, (a.GetElement(i + 1) + flag) % 10);
		flag = (a.GetElement(i + 1) + flag) / 10;
	}
	for (; i < bLength; i++)
	{
		c.Insert(i + 1, (b.GetElement(i + 1) + flag) % 10);
		flag = (b.GetElement(i + 1) + flag) / 10;
	}
	if (flag == 1)
	{
		c.Insert(c.GetLength() + 1, 1);
	}
	return c;
}
int main()
{
	int array1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	int array2[] = { 8, 7, 6, 5, 4, 3, 2,1 };
	SeqList<int>a = SeqList<int>(array1, 9);
	cout << "请输入第一个大整数:" << endl;
	a.PrintSeqList();
	SeqList<int>b = SeqList<int>(array2, 8);
	cout << "请输入第二个大整数:" << endl;
	b.PrintSeqList();
	SeqList<int>c = Add(a, b);
	cout << "两个大整数的和是:" << endl;
	c.PrintSeqList();
	return 0;
}

三、运行结果:
运行结果
2020.3.19更新:
更改了一下main函数,达到了运行时输入整数的效果:

int main()
{
int T1, T2, Q1, Q2;
	cout << "请输入第一个大整数的位数:" << endl;
	cin >> T1;
	int* array1 = new int[T1];
	for (int i = 0; i < T1; i++) {
		cout << "请按位输入第一个大整数:" << endl;
		cin >> Q1;
		array1[i] = Q1;
	}
	cout << "请输入第二个大整数的位数:" << endl;
	cin >> T2;
	int* array2 = new int[T2];
	for (int i = 0; i < T2; i++) {
		cout << "请按位输入第二个大整数:" << endl;
		cin >> Q2;
		array2[i] = Q2;
	}
	SeqList<int>a = SeqList<int>(array1, T1);
	a.PrintSeqList();
	SeqList<int>b = SeqList<int>(array2, T2);
	b.PrintSeqList();
	SeqList<int>c = Add(a, b);
	cout << "两个大整数的和是:" << endl;
	c.PrintSeqList();
	return 0;
}

运行结果

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值