大数相加算法的实现

来源:互联网 发布:学唇语 唇唇欲动软件 编辑:程序博客网 时间:2024/06/01 08:41

看到一个帖子,说到大数相加的问题。实现一个代码,贴在这里。


#include <iostream>
#include <string>
#include <stack>
using namespace std;


typedef stack<int> _NumStack;

//大数相加的封装函数
bool AddNum(const string strInput1,const string strInput2, _NumStack &stackResult);

//两数相加的第一部分:即将两个大数相同位数进行相加
bool AddFirst(const string strInput1,const string strInput2,int &nCarry, _NumStack &stackResult);

//两数相加的第二部分
bool AddSecond(const string strInput,int nCarry,int nStart,_NumStack &stackResult);

int main(int argc,char **argv)
{
string strInput1;
string strInput2;


cout<<"Please Input Your Num!\n";


while(cin>>strInput1>>strInput2)
{
_NumStack stackResult;
if(!AddNum(strInput1,strInput2,stackResult))
break;


//输出结果
if(!stackResult.empty())
{
cout<<"Result:\t";
for(int i = stackResult.size();i>0; i--)
{
cout<<stackResult.top();
stackResult.pop();
}
}
}
return 0;
}


bool AddNum(const string strInput1,const string strInput2, _NumStack &stackResult)
{
if(strInput1.empty() || strInput2.empty())
return false;



int nCarry = 0; //进位标识


if(AddFirst(strInput1,strInput2,nCarry,stackResult))
{
int nLen1 = strInput1.size() - 1;
int nLen2 = strInput2.size() - 1;
if(nLen1 == nLen2)
return true;


return nLen1 > nLen2 ? AddSecond(strInput1,nCarry,nLen1-nLen2,stackResult) : AddSecond(strInput2,nCarry,nLen2 - nLen1,stackResult);
}

return false;
}


bool AddFirst(const string strInput1,const string strInput2,int &nCarry, _NumStack &stackResult)
{
if(strInput1.empty() || strInput2.empty())
return false;


int nLen1 = strInput1.size() - 1;
int nLen2 = strInput2.size() - 1;


for(;nLen1 >= 0 && nLen2 >= 0; nLen1--,nLen2--)
{
int nTemp = strInput1[nLen1] - '0' + strInput2[nLen2] - '0' + nCarry;


nCarry = nTemp < 10 ? 0 : 1;
if(nCarry)
nTemp %= 10;

stackResult.push(nTemp);
}

return true;
}

bool AddSecond(const string strInput,int nCarry,int nStart,_NumStack &stackResult)
{
if(strInput.empty())
return false;

for(; nStart >= 0; nStart --)
{
int nTemp = strInput[nStart] - '0' + nCarry;

nCarry = nTemp < 10 ? 0 : 1;
if(nCarry)
nTemp %= 10;

stackResult.push(nTemp);
}

return true;
}
原创粉丝点击