初次看到这个时,最先想到的就是:大数嘛,那就定义一个long、double这种类型的变量,然后相加。当然这种想法显然是没有经过仔细考虑的,并且也是行不通的。如果数的大小超过了double能表示的范围呢,虽然这在一般的实际应用中很难遇到。
所以就得换种思路,通常的方法便是把大整数不要当成一个数,而是当作一个只由数字构成的字符串,而具体相加的实现则是利用小学生都会的竖式相加的方法。(PS:换个角度,换种思路的思考方式真的很有用,但是能不能熟练掌握就得看自己的悟性了)
懂得方法了,实现起来应该没多大问题,下面是用C++实现的完整代码。
#include<iostream>
#include<string>
#include<iterator>
using namespace std;
int main()
{
string A, B, Sum;
cin >> A;
cin >> B;
//let A be longer than B
if( A.size() < B.size() )
{
string temp;
temp = A;
A = B;
B = temp;
}
unsigned int err = A.size() - B.size();
string cml(err, '0');
char carry = '0';
B = cml + B;
string::reverse_iterator r_itA = A.rbegin(), r_itB = B.rbegin();
*r_itA -= '0';
*r_itB -= '0';
if( (*r_itA + *r_itB) > 9)
{
Sum.push_back( *r_itA + *r_itB - 10 + '0');
carry = '1';
}
else
{
Sum.push_back( *r_itA + *r_itB + '0');
carry = '0';
}
++r_itA;
++r_itB;
for( ; r_itB != B.rend(); ++r_itA, ++r_itB)
{
*r_itA -= '0';
*r_itB -= '0';
carry -= '0';
if( (*r_itA + *r_itB + carry) > 9)
{
Sum.push_back( *r_itA + *r_itB + carry - 10 + '0');
carry = '1';
}
else
{
Sum.push_back( *r_itA + *r_itB + carry + '0');
carry = '0';
}
}
if(carry == '1')
Sum.push_back(carry);
for(string::reverse_iterator r_it = Sum.rbegin(); r_it != Sum.rend(); ++r_it)
cout << *r_it;
return 0;
}