出这题目的人就应该拖出去爆莎。
说明:
由于A和B输出时需要从头至尾遍历,而做加法时需要从尾至头遍历,因此使用双向链表存储。
可以从长整数的低位开始拆分(4位为一组,即不超过9999的非负整数),依次存放在链表的每个结点的数据域中;头结点的数据域存放正负数标志(正数或0:1,负数:-1)。
这就是一个简单的高精度加减法运算, 要是说复杂也就仅仅在多位一起计算上增加了一点点。
但是玄妙的地方在于出题人要用双链表???
链表的优点在于中间位置插入和删除,虽然说使用链表可以节约最后翻转数字的操作时间,但是却浪费了大量的空间,提高了编程难度。
思路就是同号做加法,异号做减法。
至于双向链表的操作详解,不多说了。
不行了,只有加法用了双向链表,如果减法再用人就无了。
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
using namespace std;
struct DualNode
{
int data=0;
char cc = '+';
struct DualNode* prior = NULL;
struct DualNode* next = NULL;
};
int my_pow(int x)
{
int ans = 1;
while (x--)
ans *= 10;
return ans;
}
void flodput(int n,bool tail)
{
if (tail)
{
if (n == 0)
return;
cout << n;
return;
}
if (n < 10)
cout << "000" << n;
if (10 <= n && n < 100)
cout << "00" << n;
if (100 <= n && n < 1000)
cout << "0" << n;
if (1000 <= n)
cout << n;
}
void out_putj(DualNode* H)
{
if (H == NULL)
return;
DualNode* p, * tail;
p = H;
while (1)
{
if (p->next == NULL)
{
tail = p;
break;
}
p = p->next;
}
bool fis = true;
while (1)
{
if (fis)
{
flodput(tail->data, true);
if (tail->prior == NULL)
cout << endl;
else
cout << "->";
fis = false;
}
else
{
flodput(tail->data, false);
if (tail->prior == NULL)
cout << endl;
else
cout << "->";
}
if (tail->prior == NULL)
{
break;
}
tail = tail->prior;
}
return;
}
void out_put(DualNode* H)
{
if (H == NULL)
return;
DualNode* p, * tail;
p = H;
while (1)
{
if (p->next == NULL)
{
tail = p;
break;
}
p = p->next;
}
bool fis = true;
while (1)
{
if (fis)
{
flodput(tail->data, true);
if (tail->prior == NULL)
cout << endl;
else
cout << ",";
fis = false;
}
else
{
flodput(tail->data, false);
if (tail->prior == NULL)
cout << endl;
else
cout << ",";
}
if (tail->prior == NULL)
{
break;
}
tail = tail->prior;
}
return;
}
DualNode* line_add(DualNode* head1, DualNode* head2)
{
DualNode *ans=NULL,*N=NULL,*Q=NULL;
DualNode* p1, * p2;
p1 = head1;
p2 = head2;
bool fin = false;
int carry = 0, l = 0;
int Tnum;
while (1)
{
Tnum = p2->data + p1->data + carry;//总和计算
carry = (int)Tnum / 10000;//进位计算
Tnum = Tnum % 10000;//当前的数字
//_____________________________
N = new DualNode;//先新建
N->data = Tnum;//内容赋值
l = l + 1;//增加长度
if (l == 1)
ans = N;//头节点判断
else
{
Q->next = N;
N->prior = Q;
}
Q = N;
//----------
//如果A、B的长度相同
if (p1->next == NULL && p2->next == NULL)
{
if (carry != 0)
{
//----------
N = new DualNode;//先新建
N->data = carry;//内容赋值
l = l + 1;//增加长度
if (l == 1)
ans = N;//头节点判断
else
{
Q->next = N;
N->prior = Q;
}
Q = N;
//----------
}
return ans;
}
//如果B比A短
if (p2->next == NULL)
{
p1 = p1->next;
break;
}
p1 = p1->next;
p2 = p2->next;
}
while (1)
{
Tnum = p1->data + carry;//总和计算
carry = (int)Tnum / 10000;//进位计算
Tnum = Tnum % 10000;//当前的数字
//----------------------
N = new DualNode;//先新建
N->data = Tnum;//内容赋值
l = l + 1;//增加长度
if (l == 1)
ans = N;//头节点判断
else
{
Q->next = N;
N->prior = Q;
}
Q = N;
//---------------------
if (p1->next == NULL)
{
if (carry != 0)
{
//----------
N = new DualNode;//先新建
N->data = carry;//内容赋值
l = l + 1;//增加长度
if (l == 1)
ans = N;//头节点判断
else
{
Q->next = N;
N->prior = Q;
}
Q = N;
//----------
}
break;
}
p1 = p1->next;
}
return ans;
}
int my_compare(string s1, string s2)
{
if (s1.length() > s2.length())
return 1;
else if (s1.length() < s2.length())
return -1;
else
return s1.compare(s2);
}
DualNode* line_sub(DualNode* head1, DualNode* head2)
{
DualNode* ans = NULL, * N = NULL, * Q = NULL;
DualNode* p1, * p2;
p1 = head1;
p2 = head2;
bool fin = false;
int carry = 0, l = 0;
int Tnum;
while (1)
{
if (p1->data > p2->data)
;
Tnum = p1->data - p2->data + carry;//总和计算
carry = (int)Tnum / 10000;//进位计算
Tnum = Tnum % 10000;//当前的数字
//_____________________________
N = new DualNode;//先新建
N->data = Tnum;//内容赋值
l = l + 1;//增加长度
if (l == 1)
ans = N;//头节点判断
else
{
Q->next = N;
N->prior = Q;
}
Q = N;
//----------
//如果A、B的长度相同
if (p1->next == NULL && p2->next == NULL)
{
if (carry != 0)
{
//----------
N = new DualNode;//先新建
N->data = carry;//内容赋值
l = l + 1;//增加长度
if (l == 1)
ans = N;//头节点判断
else
{
Q->next = N;
N->prior = Q;
}
Q = N;
//----------
}
return ans;
}
//如果B比A短
if (p2->next == NULL)
{
p1 = p1->next;
fin = false;
break;
}
//如果A比B短
if (p1->next == NULL)
{
p2 = p2->next;
fin = true;
break;
}
p1 = p1->next;
p2 = p2->next;
}
while (1)
{
Tnum = p1->data + carry;//总和计算
carry = (int)Tnum / 10000;//进位计算
Tnum = Tnum % 10000;//当前的数字
//----------------------
N = new DualNode;//先新建
N->data = Tnum;//内容赋值
l = l + 1;//增加长度
if (l == 1)
ans = N;//头节点判断
else
{
Q->next = N;
N->prior = Q;
}
Q = N;
//---------------------
if (p1->next == NULL)
{
if (carry != 0)
{
//----------
N = new DualNode;//先新建
N->data = carry;//内容赋值
l = l + 1;//增加长度
if (l == 1)
ans = N;//头节点判断
else
{
Q->next = N;
N->prior = Q;
}
Q = N;
//----------
}
break;
}
p1 = p1->next;
}
return ans;
}
string sub(string str1, string str2)
{
string str;
int tmp = str1.length() - str2.length();
int cf = 0;
for (int i = str2.length() - 1; i >= 0; i--)
{
if (str1[tmp + i] < str2[i] + cf)
{
str = char(str1[tmp + i] - str2[i] - cf + '0' + 10) + str;
cf = 1;
}
else
{
str = char(str1[tmp + i] - str2[i] - cf + '0') + str;
cf = 0;
}
}
for (int i = tmp - 1; i >= 0; i--)
{
if (str1[i] - cf >= '0')
{
str = char(str1[i] - cf) + str;
cf = 0;
}
else
{
str = char(str1[i] - cf + 10) + str;
cf = 1;
}
}
str.erase(0, str.find_first_not_of('0'));
return str;
}
void inPart(string a, string b, char c1, char c2)
{
int i, j;
int len1 = 0, len2 = 0;
DualNode* head1=NULL, * head2=NULL, * N=NULL, * Q=NULL;
int t, number;
//----------------------
head1 = NULL;
t = 0, number = 0;
for (i = a.length() - 1; i >= 0; i--)
{
number += (a[i] - '0') * my_pow(t);
t++;
if (t % 4 == 0 || (a.length() % 4 != 0 && i == 0))
{
//cout << "NU=" << number << endl;
t = 0;
//----------
N = new DualNode;//先新建
N->data = number;//内容赋值
len1 = len1 + 1;//增加长度
if (len1 == 1)
head1 = N;//头节点判断
else
{
Q->next = N;
N->prior = Q;
//head1->prior = N;
}
Q = N;
number = 0;
}
}
if (c1 == '-')
cout << '-';
out_put(head1);
//----------------------
head2 = NULL;
t = 0, number = 0;
for (i = b.length() - 1; i >= 0; i--)
{
number += (b[i] - '0') * my_pow(t);
t++;
if (t % 4 == 0 || (b.length() % 4 != 0 && i == 0))
{
//cout << "NU=" << number << endl;
t = 0;
//----------
N = new DualNode;//先新建
N->data = number;//内容赋值
len2 = len2 + 1;//增加长度
if (len2 == 1)
head2 = N;//头节点判断
else
{
Q->next = N;
N->prior = Q;
//head2->prior = N;
}
Q = N;
number = 0;
}
}
if (c2 == '-')
cout << '-';
out_put(head2);
cout << endl;
DualNode* ans;
if (c1 == c2)
{
//cout << "len1" << len1<<endl;
//cout << "len2" << len2<<endl;
if (len2 > len1)
swap(head1, head2);
ans = line_add(head1, head2);
out_putj(ans);
if (c1 == '-')
cout << '-';
out_put(ans);
}
else
{
if(my_compare(a,b)==-1)
{
swap(a, b);
swap(c1, c2);
}
if (my_compare(a, b) == 0)
{
cout << 0 << endl;
cout << 0 << endl;
return;
}
string an = sub(a, b);
int lend = an.length();
int strl = lend % 4;
if (strl != 0)
{
for (i = 0; i < strl; i++)
{
cout << an[i];
}
if (i != lend)
cout << "->";
else
cout << endl;
}
int hdt = 0;
for (i = strl; i <lend; i++)
{
hdt++;
cout << an[i];
if (hdt % 4 == 0)
{
hdt = 0;
if (i != lend - 1)
cout << "->";
else
cout << endl;
}
}
if (c1 == '-')
cout << '-';
if (strl != 0)
{
for (i = 0; i < strl; i++)
{
cout << an[i];
}
if (i != lend)
cout << ',';
else
cout << endl;
}
hdt = 0;
for (i = strl; i < lend; i++)
{
hdt++;
cout << an[i];
if (hdt % 4 == 0)
{
hdt = 0;
if (i != lend - 1)
cout << ",";
else
cout << endl;
}
}
}
return;
}
int main()
{
int n;
string s1, s2;//输入
char c1 = '+', c2 = '+';//储存正负号
cin >> s1 >> s2;
if (s1[0] == '-')
{
c1 = '-';
s1.erase(0, 1);
//return 0;
}
if (s2[0] == '-')
{
c2 = '-';
s2.erase(0, 1);
//return 0;
}
//cout << s1 << endl;
//cout << s2 << endl;
inPart(s1, s2, c1, c2);
return 0;
}