您的位置:首页 > 其它

大数相加算法的实现

2011-12-03 10:29 162 查看
看到一个帖子,说到大数相加的问题。实现一个代码,贴在这里。

#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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: