我们知道,所有的数据类型,例如int、long int、double等等,他们所存放的数据都是有范围的,那么问题来了,当出现两个特别大的数,就算是用long long int也存放不下的时候,我们应该如何去计算呢
hdoj 的1002题就出现了这种情况(可以考虑一下再往下看)

这个时候的解决方法一般是使用字符串来解决,当然用c++还是很麻烦的,java的话听说好像有库函数可以直接调用,我现在来写一下c++的解决方案
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
string add(string a , string b);
int main()
{
string a , b;
cin >> a >> b;
add(a,b);
cout << add(a,b) << endl;
return 0;
}
string add(string a , string b)
{
a = a.substr(a.find_first_not_of('0')); //把字串中前面的0去掉
b = b.substr(b.find_first_not_of('0'));
long long lenA = a.length(); //用lenA来保存A的长度
long long lenB = b.length();
long long len = max(a.length() ,b.length()) + 5; //用len就是答案的长度 ,当a和b的长度相同时,加起来可能会进一位,所以可以多加一点点
reverse(a.begin() , a.end()); //下面计算时时从前往后计算,也就是说先算的高位
reverse(b.begin() , b.end()); //所以要转换一下 把串反转,就会用到reverse函数
string ans(len , '0'); //定义存放答案的串,长度为len,全部初始化为'0'
for(int i = 0 ; i < a.length() ; ++ i)//将a串中的字符全部放在c串中
{
ans[i] = a[i];
}
int temp = 0;//表示进位
for(int i = 0 ; i < len ; ++i)
{
if (i < b.length())
temp+=(ans[i] - '0') + (b[i] - '0'); //计算进位 如9+9=18
else
temp+=(ans[i] - '0');
ans[i] = temp%10 + '0'; //将进位的个位数保存 将8保留
temp/=10; //十位数保留,给下一次计算 1放在下一次计算
}
reverse(ans.begin(),ans.end()); //算完了之后记得翻转过来
return ans.substr(ans.find_first_not_of('0'));//反转过来可能有0,去掉
}






Comments NOTHING