2、长整数加法运算

出这题目的人就应该拖出去爆莎。

说明:

由于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;
}

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值