长整数加减法运算
【问题描述】
设计一个实现任意长的整数进行加法和减法运算的演示程序。
【基本要求】
利用双向循环链表实现长整数的存储,每个结点含一个整型变量。输入和输出形式:按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。
【测试数据】
(1)0;0;应输出“0”。
(2)-2345,6789;-7654,3211;应输出“-1,0000,0000”。
(3)-9999,9999;1,0000,0000,0000;应输出“9999,0000,0001”
(4)1,0001,0001;-1,0001,0001;应输出“0”。
(5)1,0001,0001;-1,0001,0000;应输出“1”。
(6)-9999,9999,9999;-9999,9999,9999;应输出“-1,9999,9999,9998”。
(7)1,0000,9999,9999;1;应输出“1,0001,0000,0000”。
【实现提示】
(1)可以在每个结点中仅存十进制的4位,即不超过9999的非负整数。
(2)可以利用头结点数据域的符号代表长整数的符号。用其绝对值表示元素结点数目。相加过程中不要破坏两个操作数链表。不能给长整数位数规定上限。
结点定义
template<class T>
struct LinkNode
{
T data;
LinkNode<T>* Leftlink;
LinkNode<T>* Rightlink;
LinkNode()
{
data = 0;
Leftlink = NULL;
Rightlink = NULL;
}
LinkNode(T x)
{
data = x;
Leftlink = NULL;
Rightlink = NULL;
}
};
双向循环链表函数定义
template<class T>
class CircLinkList
{
public:
CircLinkList();//构造函数
CircLinkList(T x);//含参构造函数
~CircLinkList();//析构函数
bool Insert(T x);//插入结点
LinkNode<T>* Get_head();//取头结点
void Make_Empty();//清空链表
private:
LinkNode<T>* head;
};
构造函数
template<class T>
CircLinkList<T>::CircLinkList()
{
head = new LinkNode<T>;
head->Leftlink = head;
head->Rightlink = head;
}
template<class T>
CircLinkList<T>::CircLinkList(T x)
{
head = new LinkNode<T>(x);
head->Leftlink = head;
head->Rightlink = head;
}
析构函数
template<class T>
CircLinkList<T>::~CircLinkList()
{
Make_Empty();
}
插入结点
template<class T>
bool CircLinkList<T>::Insert(T x)
{
LinkNode<T>* newnode, * current = head;
newnode = new LinkNode<T>(x);
if (newnode == NULL)
{
cout << "内存不足" << endl;
return false;
}
while (1)
{
if (current->Rightlink == head)
{
newnode->Rightlink = current->Rightlink;
current->Rightlink = newnode;
newnode->Leftlink = current;
current = current->Rightlink;
current->Rightlink->Leftlink = newnode;
break;
}
current = current->Rightlink;
}
return true;
}
取头结点
template<class T>
LinkNode<T>* CircLinkList<T>::Get_head()
{
return head;
}
清空链表
template<class T>
void CircLinkList<T>::Make_Empty()
{
LinkNode<T>* current = head->Rightlink, * p = NULL;
while (current != head)
{
p = current;
current = current->Rightlink;
delete p;
p = NULL;
}
current = NULL;
delete head;
head = NULL;
}
自定义函数
void Input(string& a,string& b);//输入函数
bool Check_Input(const string& t);//检查输入是否合法
void Calctor(string a, string b);//加减法计算器
void Check_count(int& n, string a);//头结点数据域赋值
void All_int_IN(string a, CircLinkList<int>& t);//长整数插入链表
void Add_int(LinkNode<int>* Lhead, LinkNode<int>* Rhead);//加法运算
void Sub_int(LinkNode<int>* Lhead, LinkNode<int>* Rhead);//减法运算
void Output(LinkNode<int>* t);//输出函数
void Delete_result(LinkNode<int>* t);//删除运算结果
输入函数
void Input(string& a, string& b)
{
cout << "来自UJN_Zgq的长整数加减法计算器" << endl;
cout << "请输入第一个长整数:(合法输入格式:1,0001,0001)" << endl;
L1: cin >> a;
if (!Check_Input(a))
{
a = "";
cout << "输入非法!!!" << endl;
cout << "请重新输入第一个长整数:(合法输入格式:1,0001,0001)" << endl;
goto L1;
}
cout << "请输入第二个长整数:(合法输入格式:1,0001,0001)" << endl;
L2: cin >> b;
if (!Check_Input(b))
{
b = "";
cout << "输入非法!!!" << endl;
cout << "请重新输入第二个长整数:(合法输入格式:1,0001,0001)" << endl;
goto L2;
}
}
检查输入合法
bool Check_Input(const string& t)
{
int len = t.length();
char flag = ',';
int p = 0;
int i = 0;
if (t[0] == '-')
i = 1;
while (p != -1 || i < len)
{
int num = 0;
p = t.find(flag, i);
if (p == -1)
{
num = stoi(t.substr(i, len - i));
if (num < 0 || num>9999)
return false;
i = len;
}
else
{
num = stoi(t.substr(i, p - i));
if (num < 0 || num>9999)
return false;
i = p + 1;
}
}
return true;
}
加减法计算器
void Calctor(string a, string b)
{
int coount1 = 0, count2 = 0, left = 0, right = 0;
Check_count(coount1, a);
Check_count(count2, b);
CircLinkList<int> Left_num(coount1), Right_num(count2);
LinkNode<int>* Left_head = NULL, *Right_head = NULL;
Left_head = Left_num.Get_head();
Right_head = Right_num.Get_head();
All_int_IN(a,Left_num);
All_int_IN(b, Right_num);
cout << "加法结果输出:" << endl;
Add_int(Left_head, Right_head);
cout << "减法结果输出:" << endl;
Right_head->data = -Right_head->data;
Sub_int(Left_head, Right_head);
Right_head->data = -Right_head->data;
}
头结点数据域赋值
void Check_count(int& n, string a)
{
int len = a.length();
for (int i = 0; i < len; i++)
{
if (isdigit(a[i]))
{
n++;
}
}
if (a[0] == '-')
n = -n;
}
长整数插入链表
void All_int_IN(string a, CircLinkList<int>& t)
{
int len = a.length();
char flag = ',';
int p = 0;
int i = 0;
while (p != -1 || i < len)
{
int num = 0;
p = a.find(flag, i);
if (p == -1)
{
num = stoi(a.substr(i, len-i));
if (num < 0)
num = -num;
t.Insert(num);
i = len;
}
else
{
num = stoi(a.substr(i, p-i));
if (num < 0)
num = -num;
t.Insert(num);
i = p + 1;
}
}
}
加法运算
void Add_int(LinkNode<int>* Lhead, LinkNode<int>* Rhead)
{
int num = 0;
LinkNode<int>* result=NULL;
result = new LinkNode<int>;
if (result == NULL)
return;
LinkNode<int>* Left = Lhead, * Right = Rhead;
if (Left->data > 0 && Right->data > 0 || Left->data < 0 && Right->data < 0)
{
int flag = 0;
if (Left->data > 0)
{
result->data = 1;
}
else
{
result->data = -1;
}
Left = Left->Leftlink;
Right = Right->Leftlink;
while (Left != Lhead || Right != Rhead || flag == 1)
{
LinkNode<int>* newnode;
if (Right == Rhead || Left == Lhead)
{
if (Left == Lhead && Right == Rhead)
num = 0 + 0 + flag;
else
{
if (Right == Rhead)
num = Left->data + 0 + flag;
else
{
if (Left == Lhead)
num = 0 + flag + Right->data;
}
}
}
else
{
num = Left->data + Right->data + flag;
}
flag = 0;
if (num > 9999)
{
num -= 10000;
flag = 1;
}
if (Left != Lhead)
Left = Left->Leftlink;
if (Right != Rhead)
Right = Right->Leftlink;
newnode = new LinkNode<int>(num);
newnode->Rightlink = result->Rightlink;
result->Rightlink = newnode;
}
Output(result);
Delete_result(result);
}
else
{
Sub_int(Lhead, Rhead);
}
}
减法运算
void Sub_int(LinkNode<int>* Lhead, LinkNode<int>* Rhead)
{
LinkNode<int>* Left = Lhead, * Right = Rhead;
LinkNode<int>* result = NULL;
result = new LinkNode<int>;
if (result == NULL)
return;
if (Left->data > 0 && Right->data < 0 || Left->data < 0 && Right->data > 0)
{
int flag = 0;
if (abs(Left->data) > abs(Right->data))
{
if (Left->data < 0)
result->data = -1;
else
result->data = 1;
Left = Left->Leftlink;
Right = Right->Leftlink;
while (Left != Lhead)
{
LinkNode<int>* newnode = NULL;
int num = 0;
if (Right != Rhead)
num = Left->data - Right->data - flag;
else
num = Left->data - 0 - flag;
flag = 0;
if (num < 0)
{
flag = 1;
num += 10000;
}
if (Right != Rhead)
Right = Right->Leftlink;
Left = Left->Leftlink;
newnode = new LinkNode<int>(num);
newnode->Rightlink = result->Rightlink;
result->Rightlink = newnode;
}
}
else
{
if (abs(Left->data) < abs(Right->data))
{
if (Right->data < 0)
result->data = -1;
else
result->data = 1;
Left = Left->Leftlink;
Right = Right->Leftlink;
while (Right != Rhead )
{
LinkNode<int>* newnode = NULL;
int num = 0;
if (Left != Lhead)
num = Right->data - Left->data - flag;
else
num = Right->data - 0 - flag;
flag = 0;
if (num < 0)
{
flag = 1;
num += 10000;
}
if (Left != Lhead)
Left = Left->Leftlink;
Right = Right->Leftlink;
newnode = new LinkNode<int>(num);
newnode->Rightlink = result->Rightlink;
result->Rightlink = newnode;
}
}
else
{
if (Left->data < 0)
{
int flag = 0;
Left = Left->Leftlink;
Right = Right->Leftlink;
while (Left != Lhead && Right != Rhead)
{
LinkNode<int>* newnode = NULL;
int num = 0;
num = Right->data - Left->data - flag;
if (num < 0)
{
if (Right->Leftlink != Rhead)
{
flag = 1;
num += 10000;
}
}
if (Right != Rhead)
Right = Right->Leftlink;
if (Left != Lhead)
Left = Left->Leftlink;
if (Right == Rhead && Left == Lhead)
{
if (num < 0)
result->data = -1;
else
result->data = 1;
}
newnode = new LinkNode<int>(num);
newnode->Rightlink = result->Rightlink;
result->Rightlink = newnode;
}
}
else
{
int flag = 0;
Left = Left->Leftlink;
Right = Right->Leftlink;
while (Left != Lhead && Right != Rhead)
{
LinkNode<int>* newnode = NULL;
int num = 0;
num = Left->data - Right->data - flag;
if (num < 0)
{
if (Left->Leftlink != Lhead)
{
flag = 1;
num += 10000;
}
}
if (Right != Rhead)
Right = Right->Leftlink;
if (Left != Lhead)
Left = Left->Leftlink;
if (Right == Rhead && Left == Lhead)
{
if (num < 0)
result->data = -1;
else
result->data = 1;
}
newnode = new LinkNode<int>(num);
newnode->Rightlink = result->Rightlink;
result->Rightlink = newnode;
}
}
}
}
Output(result);
Delete_result(result);
}
else
{
Add_int(Lhead, Rhead);
}
}
输出函数
void Output(LinkNode<int>* t)
{
int temp = 0;
LinkNode<int>* current = t->Rightlink;
while (current != NULL)
{
if (current->data == 0)
{
if (current->Rightlink == NULL)
cout << current->data;
}
else
{
break;
}
current = current->Rightlink;
}
if (current != NULL)
{
if (t->data < 0)
cout << '-';
}
int flag = 1;
while(current != NULL)
{
temp = current->data;
if (flag == 0)
{
cout << temp / 1000 << temp / 100 % 10 << temp / 10 % 10 << temp % 10;
flag = 0;
}
else
{
cout << current->data;
flag = 0;
}
current = current->Rightlink;
if (current != NULL)
cout << ',';
}
cout << endl;
}
删除运算结果
void Delete_result(LinkNode<int>* t)
{
LinkNode<int>* current = t;
while (t != NULL)
{
t = t->Rightlink;
delete current;
current = t;
}
}
主函数
int main()
{
string a, b;
Input(a, b);
Calctor(a, b);
return 0;
}
完整代码
#include<iostream>
#include<string>
using namespace std;
template<class T>
struct LinkNode
{
T data;
LinkNode<T>* Leftlink;
LinkNode<T>* Rightlink;
LinkNode()
{
data = 0;
Leftlink = NULL;
Rightlink = NULL;
}
LinkNode(T x)
{
data = x;
Leftlink = NULL;
Rightlink = NULL;
}
};
template<class T>
class CircLinkList
{
public:
CircLinkList();//构造函数
CircLinkList(T x);//含参构造函数
~CircLinkList();//析构函数
bool Insert(T x);//插入结点
LinkNode<T>* Get_head();//取头结点
void Make_Empty();//清空链表
private:
LinkNode<T>* head;
};
template<class T>
CircLinkList<T>::CircLinkList()
{
head = new LinkNode<T>;
head->Leftlink = head;
head->Rightlink = head;
}
template<class T>
CircLinkList<T>::CircLinkList(T x)
{
head = new LinkNode<T>(x);
head->Leftlink = head;
head->Rightlink = head;
}
template<class T>
CircLinkList<T>::~CircLinkList()
{
Make_Empty();
}
template<class T>
bool CircLinkList<T>::Insert(T x)
{
LinkNode<T>* newnode, * current = head;
newnode = new LinkNode<T>(x);
if (newnode == NULL)
{
cout << "内存不足" << endl;
return false;
}
while (1)
{
if (current->Rightlink == head)
{
newnode->Rightlink = current->Rightlink;
current->Rightlink = newnode;
newnode->Leftlink = current;
current = current->Rightlink;
current->Rightlink->Leftlink = newnode;
break;
}
current = current->Rightlink;
}
return true;
}
template<class T>
LinkNode<T>* CircLinkList<T>::Get_head()
{
return head;
}
template<class T>
void CircLinkList<T>::Make_Empty()
{
LinkNode<T>* current = head->Rightlink, * p = NULL;
while (current != head)
{
p = current;
current = current->Rightlink;
delete p;
p = NULL;
}
current = NULL;
delete head;
head = NULL;
}
void Input(string& a,string& b);//输入函数
bool Check_Input(const string& t);//检查输入是否合法
void Calctor(string a, string b);//加减法计算器
void Check_count(int& n, string a);//头结点数据域赋值
void All_int_IN(string a, CircLinkList<int>& t);//长整数插入链表
void Add_int(LinkNode<int>* Lhead, LinkNode<int>* Rhead);//加法运算
void Sub_int(LinkNode<int>* Lhead, LinkNode<int>* Rhead);//减法运算
void Output(LinkNode<int>* t);//输出函数
void Delete_result(LinkNode<int>* t);//删除运算结果
void All_int_IN(string a, CircLinkList<int>& t)
{
int len = a.length();
char flag = ',';
int p = 0;
int i = 0;
while (p != -1 || i < len)
{
int num = 0;
p = a.find(flag, i);
if (p == -1)
{
num = stoi(a.substr(i, len-i));
if (num < 0)
num = -num;
t.Insert(num);
i = len;
}
else
{
num = stoi(a.substr(i, p-i));
if (num < 0)
num = -num;
t.Insert(num);
i = p + 1;
}
}
}
void Check_count(int& n, string a)
{
int len = a.length();
for (int i = 0; i < len; i++)
{
if (isdigit(a[i]))
{
n++;
}
}
if (a[0] == '-')
n = -n;
}
bool Check_Input(const string& t)
{
int len = t.length();
char flag = ',';
int p = 0;
int i = 0;
if (t[0] == '-')
i = 1;
while (p != -1 || i < len)
{
int num = 0;
p = t.find(flag, i);
if (p == -1)
{
num = stoi(t.substr(i, len - i));
if (num < 0 || num>9999)
return false;
i = len;
}
else
{
num = stoi(t.substr(i, p - i));
if (num < 0 || num>9999)
return false;
i = p + 1;
}
}
return true;
}
void Output(LinkNode<int>* t)
{
int temp = 0;
LinkNode<int>* current = t->Rightlink;
while (current != NULL)
{
if (current->data == 0)
{
if (current->Rightlink == NULL)
cout << current->data;
}
else
{
break;
}
current = current->Rightlink;
}
if (current != NULL)
{
if (t->data < 0)
cout << '-';
}
int flag = 1;
while(current != NULL)
{
temp = current->data;
if (flag == 0)
{
cout << temp / 1000 << temp / 100 % 10 << temp / 10 % 10 << temp % 10;
flag = 0;
}
else
{
cout << current->data;
flag = 0;
}
current = current->Rightlink;
if (current != NULL)
cout << ',';
}
cout << endl;
}
void Input(string& a, string& b)
{
cout << "来自UJN_Zgq的长整数加减法计算器" << endl;
cout << "请输入第一个长整数:(合法输入格式:1,0001,0001)" << endl;
L1: cin >> a;
if (!Check_Input(a))
{
a = "";
cout << "输入非法!!!" << endl;
cout << "请重新输入第一个长整数:(合法输入格式:1,0001,0001)" << endl;
goto L1;
}
cout << "请输入第二个长整数:(合法输入格式:1,0001,0001)" << endl;
L2: cin >> b;
if (!Check_Input(b))
{
b = "";
cout << "输入非法!!!" << endl;
cout << "请重新输入第二个长整数:(合法输入格式:1,0001,0001)" << endl;
goto L2;
}
}
void Add_int(LinkNode<int>* Lhead, LinkNode<int>* Rhead)
{
int num = 0;
LinkNode<int>* result=NULL;
result = new LinkNode<int>;
if (result == NULL)
return;
LinkNode<int>* Left = Lhead, * Right = Rhead;
if (Left->data > 0 && Right->data > 0 || Left->data < 0 && Right->data < 0)
{
int flag = 0;
if (Left->data > 0)
{
result->data = 1;
}
else
{
result->data = -1;
}
Left = Left->Leftlink;
Right = Right->Leftlink;
while (Left != Lhead || Right != Rhead || flag == 1)
{
LinkNode<int>* newnode;
if (Right == Rhead || Left == Lhead)
{
if (Left == Lhead && Right == Rhead)
num = 0 + 0 + flag;
else
{
if (Right == Rhead)
num = Left->data + 0 + flag;
else
{
if (Left == Lhead)
num = 0 + flag + Right->data;
}
}
}
else
{
num = Left->data + Right->data + flag;
}
flag = 0;
if (num > 9999)
{
num -= 10000;
flag = 1;
}
if (Left != Lhead)
Left = Left->Leftlink;
if (Right != Rhead)
Right = Right->Leftlink;
newnode = new LinkNode<int>(num);
newnode->Rightlink = result->Rightlink;
result->Rightlink = newnode;
}
Output(result);
Delete_result(result);
}
else
{
Sub_int(Lhead, Rhead);
}
}
void Sub_int(LinkNode<int>* Lhead, LinkNode<int>* Rhead)
{
LinkNode<int>* Left = Lhead, * Right = Rhead;
LinkNode<int>* result = NULL;
result = new LinkNode<int>;
if (result == NULL)
return;
if (Left->data > 0 && Right->data < 0 || Left->data < 0 && Right->data > 0)
{
int flag = 0;
if (abs(Left->data) > abs(Right->data))
{
if (Left->data < 0)
result->data = -1;
else
result->data = 1;
Left = Left->Leftlink;
Right = Right->Leftlink;
while (Left != Lhead)
{
LinkNode<int>* newnode = NULL;
int num = 0;
if (Right != Rhead)
num = Left->data - Right->data - flag;
else
num = Left->data - 0 - flag;
flag = 0;
if (num < 0)
{
flag = 1;
num += 10000;
}
if (Right != Rhead)
Right = Right->Leftlink;
Left = Left->Leftlink;
newnode = new LinkNode<int>(num);
newnode->Rightlink = result->Rightlink;
result->Rightlink = newnode;
}
}
else
{
if (abs(Left->data) < abs(Right->data))
{
if (Right->data < 0)
result->data = -1;
else
result->data = 1;
Left = Left->Leftlink;
Right = Right->Leftlink;
while (Right != Rhead )
{
LinkNode<int>* newnode = NULL;
int num = 0;
if (Left != Lhead)
num = Right->data - Left->data - flag;
else
num = Right->data - 0 - flag;
flag = 0;
if (num < 0)
{
flag = 1;
num += 10000;
}
if (Left != Lhead)
Left = Left->Leftlink;
Right = Right->Leftlink;
newnode = new LinkNode<int>(num);
newnode->Rightlink = result->Rightlink;
result->Rightlink = newnode;
}
}
else
{
if (Left->data < 0)
{
int flag = 0;
Left = Left->Leftlink;
Right = Right->Leftlink;
while (Left != Lhead && Right != Rhead)
{
LinkNode<int>* newnode = NULL;
int num = 0;
num = Right->data - Left->data - flag;
if (num < 0)
{
if (Right->Leftlink != Rhead)
{
flag = 1;
num += 10000;
}
}
if (Right != Rhead)
Right = Right->Leftlink;
if (Left != Lhead)
Left = Left->Leftlink;
if (Right == Rhead && Left == Lhead)
{
if (num < 0)
result->data = -1;
else
result->data = 1;
}
newnode = new LinkNode<int>(num);
newnode->Rightlink = result->Rightlink;
result->Rightlink = newnode;
}
}
else
{
int flag = 0;
Left = Left->Leftlink;
Right = Right->Leftlink;
while (Left != Lhead && Right != Rhead)
{
LinkNode<int>* newnode = NULL;
int num = 0;
num = Left->data - Right->data - flag;
if (num < 0)
{
if (Left->Leftlink != Lhead)
{
flag = 1;
num += 10000;
}
}
if (Right != Rhead)
Right = Right->Leftlink;
if (Left != Lhead)
Left = Left->Leftlink;
if (Right == Rhead && Left == Lhead)
{
if (num < 0)
result->data = -1;
else
result->data = 1;
}
newnode = new LinkNode<int>(num);
newnode->Rightlink = result->Rightlink;
result->Rightlink = newnode;
}
}
}
}
Output(result);
Delete_result(result);
}
else
{
Add_int(Lhead, Rhead);
}
}
void Delete_result(LinkNode<int>* t)
{
LinkNode<int>* current = t;
while (t != NULL)
{
t = t->Rightlink;
delete current;
current = t;
}
}
void Calctor(string a, string b)
{
int coount1 = 0, count2 = 0, left = 0, right = 0;
Check_count(coount1, a);
Check_count(count2, b);
CircLinkList<int> Left_num(coount1), Right_num(count2);
LinkNode<int>* Left_head = NULL, *Right_head = NULL;
Left_head = Left_num.Get_head();
Right_head = Right_num.Get_head();
All_int_IN(a,Left_num);
All_int_IN(b, Right_num);
cout << "加法结果输出:" << endl;
Add_int(Left_head, Right_head);
cout << "减法结果输出:" << endl;
Right_head->data = -Right_head->data;
Sub_int(Left_head, Right_head);
Right_head->data = -Right_head->data;
}
int main()
{
string a, b;
Input(a, b);
Calctor(a, b);
return 0;
}