我们知道,所有的数据类型,例如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,去掉
	
}	
立志成为一名攻城狮
最后更新于 2020-03-11