今天写了一道两个大整数(位数超百位)相加的题,不能用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,简化了一些运算,使进行减法运算时可以更加专注,也减少了输出端口。
另外我其实还有另外一种思路,不过不太想再去实现了:将输入的大整数每十位或十五位分割一下,分别计算,考虑进位,最后再整合、输出。
如果有错误或者缺陷,还请告知啊