C++实现两个大整数相加

文章讲述了作者在解决一道要求不用Java或Python,仅使用C++中的STL库处理大整数相加问题的过程,包括处理不同符号的策略和进位计算,分享了代码实现及其思路。
摘要由CSDN通过智能技术生成

今天写了一道两个大整数(位数超百位)相加的题,不能用java和python,第一次遇到,使用了STL里的东西,写的过程中遇到了一些困难,不过,最后还是解决了,个人感觉考虑还算全面,发出来分享一下。

#include<bits/stdc++.h>
#define cto(ch) (ch-'0')//将字符转化为整数
#define sum(ch1,ch2) (cto(ch1)+cto(ch2))//直接得到两个字符对应整数的和,如‘1’+‘2’=3
#define dif(ch1,ch2) (cto(ch1)-cto(ch2))//同上,得到差
#define int long long
using namespace std;
signed main()
{
	string s1, s2;
	vector<int> v;
	while (cin >> s1 >> s2)//持续输入两个字符串,每输入两个输出结果,直到输入结束
	{
		if ((s1[0] != '-' && s2[0] != '-')|| (s1[0] == '-' && s2[0] == '-'))//情况一:两个数符号相同,同正或同负
		{
			if (s1[0] == '-' && s2[0] == '-')
			{
				s1.erase(0,1), s2.erase(0,1);
				cout << '-';
			}
			int m = min(s1.size(), s2.size());
			if (m == s1.size())
			{
				s1.insert(0, s2.size() - m, '0');
			}else{ s2.insert(0, s1.size() - m, '0'); }
			int flag = 0;
			for (int i = s1.size() - 1; i >= 0; --i)
			{
				if (sum(s1[i], s2[i])+flag > 9)
				{
					v.push_back(sum(s1[i], s2[i])+flag-10);
					flag = 1;
				}else { v.push_back(sum(s1[i], s2[i]) + flag); flag = 0; }
				if (i == 0 && flag == 1) v.push_back(1);
			}
			reverse(v.begin(), v.end());
			
			for (auto x : v)
				cout << x;
			cout << endl;
			v.clear();
		}
		else //情况二:两数符号相反
		{
			string Max, Min;
			int Flag=0;
			if (s1[0] == '-')
			{
				s1.erase(0,1);
				if (s1.size() > s2.size())
					Flag = 1,s2.insert(0,s1.size()-s2.size(),'0'), Max = s1, Min = s2;
				if (s1.size() < s2.size())
					Flag = 0,s1.insert(0,s2.size()-s1.size(),'0'),Max = s2, Min = s1;
				if (s1.size() == s2.size())
				{
					if (s1 > s2) Flag = 1,Max=s1,Min=s2;
					else Flag = 0,Max=s2,Min=s1;
				}
			}
			else
			{
				s2.erase(0, 1);
				if (s1.size() > s2.size())
					Flag = 0, s2.insert(0, s1.size() - s2.size(), '0'), Max = s1, Min = s2;
				if (s1.size() < s2.size())
					Flag = 1, s1.insert(0, s2.size() - s1.size(), '0'), Max = s2, Min = s1;
				if (s1.size() == s2.size())
				{
					if (s1 > s2) Flag = 0, Max = s1, Min = s2;
					else Flag = 1, Max = s2, Min = s1;
				}
			}
			int flag = 0;
			if (Max == Min)
				cout << 0 << endl;
			else
			{
				for (int i = Max.size() - 1; i >= 0; --i)
				{
					if (dif(Max[i], Min[i]) - flag < 0)
					{
						v.push_back(dif(Max[i], Min[i]) -flag+ 10);
						flag = 1;
					}
					else
					{
						v.push_back(dif(Max[i], Min[i]) - flag);
						flag = 0;
					}
				}
				reverse(v.begin(), v.end());
				if (Flag)
					cout << '-';
				for (int i = 0; i < v.size(); ++i)
				{
					if (v[i] != 0)
					{
						for (int j = i; j < v.size(); ++j)
							cout << v[j];
						break;
					}
				}
				cout << endl;
				v.clear();
			}
		}
	}

	return 0;
}

具体思路: 

我将输入大致上分为两种情况:一是符号相同,二是符号相反。

符号相同较为简单,直接相加,考虑进位即可;

第二种情况麻烦一点,因为不知道哪一个数是正是负,也不知道结果是正是负,思来想去,想了一种自认为简单点的方式:

 先判断输入的数字是负数绝对值大还是正数绝对值大,设置Flag,以便于决定最后是否输出负号;之后判断两个数字的大小,另设两个字符串Max和Min,大的给Max,小的给Min,简化了一些运算,使进行减法运算时可以更加专注,也减少了输出端口。

另外我其实还有另外一种思路,不过不太想再去实现了:将输入的大整数每十位或十五位分割一下,分别计算,考虑进位,最后再整合、输出。

如果有错误或者缺陷,还请告知啊

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值