最近做题经常碰到题目中说输入两个超级大整数,然后让童鞋对这两个超级大整数做运算,一开始我还因为题目有问题,哪有整形可以放得下这么大的整数,后来看了前人的做题思路后发现是我无知了,以下面这道题对这种方法做一个记录。
题目描述:
思路:用两个字符串来存放两个整数,然后用字符串模拟加法的运算,这样就可以对超级大的整数做加法运算了。
#include <iostream>
#include <string>
using namespace std;
//用字符串来模拟加法的实现
string add(string s1, string s2)
{
int len1 = s1.size();
int len2 = s2.size();
string res = ""; //用来记录运算结果
int i, j, k, t = 0; //t是进位标记
//对两个字符串相同长度的部分做加法
for (i = len1 - 1, j = len2 - 1; i >= 0 && j >= 0; --i, --j)
{
k = (s1[i] - '0') + (s2[j] - '0') + t;
//更新结果,将每一位加的结果减掉进位插到上次结果的前面
res = (char)(k % 10 + '0') + res;
t = k / 10;//计算进位
}
如果s1长的话,将长出来的位进行运算
while (i >= 0)
{
k = (s1[i] - '0') + t;
res = (char)(k % 10 + '0') + res;
t = k / 10;
--i;
}
如果s2长的话,将长出来的位进行运算
while (j >= 0)
{
k = (s2[j] - '0') + t;
res = (char)(k % 10 + '0') + res;
t = k / 10;
--j;
}
//如果最高位有进位,将进位1加到res的前面
if (t > 0)
res = (char)(t + '0') + res;
return res;
}
//比较两个字符串对应的两个整数的大小
bool great(string s1, string s2)
{
int len1 = s1.size();
int len2 = s2.size();
if (len1 > len2)
return true;
else if (len1 < len2)
return false;
else
return s1 > s2;
}
int main()
{
string a, b, c;
while (cin >> a >> b >> c)
{
if (great(add(a, b), c) && great(add(a, c), b) && great(add(b, c), a))
cout << "Yes" << endl;
else
cout << "No" << endl;
}
}