前天听到舍友说面试遇到一个大数加法的题(这里就不解释什么是大数运算了),自己想了几种方法,用字符串保存输入的大数字,然后分割成一个个比较小的数,存放在数组了,然后计算。还有就是用链表的方法,两条链表存放两个大数字,每个结点就是一个个位数,然后从尾到头依次相加;自己也在网上找了一下大数运算的方法,这两种方法都有;
今天突然想到用栈不是更好实现,把输入的数字一个个入栈,因为栈是先进后出,所以两个数相加的时候,分别从出栈,就不用考虑尾部对齐问题;然后自己就写了一下代码;
用栈实现大数加法:
我只实现了正数相加,考虑负号的话,也不是很难,需要改动一些,首先在字符串入栈的时候就确定正负,负号保存,负号也不入栈,然后就改成大数减法运算,用去掉符号后长度比较长的一个做被减数。当然 字符入栈的时候也要考虑不是’1——9’,这里假设都是正确的。
代码如下,没有考虑负数情况的:
#include <stack>
#include<deque>
#include<string>
#include<iostream>
using namespace std;
void BigNumberAdd(const string number1,const string number2)
{
if (number1.empty())
{
cout << number2 << endl;
return;
}
if (number2.empty())
{
cout << number1 << endl;
return;
}
deque<int> sum;
stack<int> num1;
stack<int> num2;
int temp = 0;
for (int i = 0; i < number1.length(); ++i)
{
temp = number1[i] - '0';
num1.push(temp);
}
for (int j = 0; j < number2.length(); ++j)
{
temp = number2[j] - '0';
num2.push(temp);
}
stack <int>::size_type add;
while (!num1.empty() && !num2.empty())
{
if (!num1.empty() && !num2.empty())
{
add = num1.top() + num2.top();
num1.pop();
num2.pop();
if (add >= 10)
{
add -= 10;
if (number1.length() > number2.length())
num1.top() += 1;
else
num2.top() += 1;
}
sum.push_back(add);
}
if (num1.empty())
{
while (!num2.empty())
{
if (num2.top() > 10)
{
add = num2.top() - 10;
num2.pop();
if (num2.empty())
{
sum.push_back(add);
sum.push_back(1);
break;
}
num2.top() += 1;
sum.push_back(add);
}
else
{
add = num2.top();
num2.pop();
sum.push_back(add);
}
}
}
else if (num2.empty())
{
while (!num1.empty())
{
if (num1.top() >= 10)
{
add = num1.top() - 10;
num1.pop();
if (num1.empty())
{
sum.push_back(add);
sum.push_back(1);
break;
}
num1.top() += 1;
sum.push_back(add);
}
else
{
add = num1.top();
num1.pop();
sum.push_back(add);
}
}
}
}
while (!sum.empty())
{
cout << sum.back();
sum.pop_back();
}
cout << endl;
}
int main()
{
//string str1 = "12321231231";
//string str2 = "234343434343";
string str1, str2;
cout << "请输入两个大数:" << endl;
cin >> str1;
cin >> str2;
BigNumberAdd(str1,str2);
return 0;
}