来自大二上学期实验报告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;
}