大数相加算法的实现
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;
}
#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;
}
相关文章推荐
- Quicksum_算法实现按顺序相加计算字符
- (链表实现)写出两个一元多项式相加的算法
- 【LeetCode-面试算法经典-Java实现】【002-Add Two Numbers (单链表表示的两个数相加)】
- (链表实现)写出两个一元多项式相加的算法
- 一元多项式相加的算法和C++实现
- 大数相加与相乘算法实现
- Java实现超大数字相加的算法
- (链表实现)写出两个一元多项式相加的算法
- 【LeetCode-面试算法经典-Java实现】【002-Add Two Numbers (单链表表示的两个数相加)】
- 算法--两种方法实现一个Add函数,让两个整数相加,但是不能使用+、-、*、/等四则运算符。
- 超长正整数(超出long表数范围)的相加算法(Java实现)
- 算法:一元多项式的表示及相加(链表实现)-数据结构(4)
- c语言实现长数字相加算法
- 【LeetCode-面试算法经典-Java实现】【129-Sum Root to Leaf Numbers(所有根到叶子结点组组成的数字相加)】
- leetcode算法题:两数相加(Java实现-效率超过100%提交者)
- 稀疏矩阵的三元组表示的实现及应用(2)——采用三元组存储稀疏矩阵,设计两个稀疏矩阵相加的运算算法
- C语言超大数相加求和、加减乘除算法实现
- 【LeetCode-面试算法经典-Java实现】【129-Sum Root to Leaf Numbers(全部根到叶子结点组组成的数字相加)】
- 大数相加算法实现
- LRU算法的实现