随意两个大整数的加减算法。可自己主动推断正负号。代码例如以下:

#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
#include <string> using namespace std; string BigInegerAdd(string s1, string s2) // s1+s2;
{
int len = s1.size()>s2.size()? s1.size()+1:s2.size()+1;
string res(len, '0');
int i = s1.size() - 1, j = s2.size() - 1, k = len - 1;
int borrow = 0;
while(i >=0 && j >= 0)
{
int sum = s1[i] - '0' + s2[j] - '0' + borrow;
if (sum >= 10)
{
borrow = 1;
sum -= 10;
res[k--] = sum + '0';
}
else {res[k--] = sum + '0'; borrow = 0;}
i--;j--;
}
while(i >= 0)
{
int sum = s1[i] - '0' + borrow;
if (sum >= 10)
{
borrow = 1;
sum -= 10;
res[k--] = sum + '0';
}
else {res[k--] = sum + '0'; borrow = 0;}
i--;
}
while(j >= 0)
{
int sum = s2[j] - '0' + borrow;
if (sum >= 10)
{
borrow = 1;
sum -= 10;
res[k--] = sum + '0';
}
else {res[k--] = sum + '0'; borrow = 0;}
j--;
}
if (borrow == 1)
{
res[k] = '1';
}
else res[k] = '0';
if (res[0] == '0')//ignore the prefix '0's
{
return res.substr(1, res.size()-1);
}
else return res; } //negative == true means s1 < s2
string BigInegerMinus(string s1, string s2, bool negative) // s1-s2;
{ if (s1.size() < s2.size())
{
return BigInegerMinus(s2, s1, true);
}
if (s1.size() == s2.size())
{
int i = 0;
while(i < s1.size() && s1[i] == s2[i])
i++;
if (s1[i] < s2[i])
{
return BigInegerMinus(s2, s1, true);
}
}
string res(s1.size(), '0');
int i = s1.size() -1, j = s2.size() - 1;
int k = i;
int borrow = 0;
while(i >= 0 && j >= 0)
{
int sum = s1[i] - '0' - borrow - (s2[j] - '0');
//cout<<sum<<endl;
if (sum < 0)
{
borrow = 1;
sum += 10;
res[k--] = sum + '0';
}
else{
borrow = 0;
res[k--] = sum + '0';
}
i--;j--;
}
while(i >= 0)
{
int sum = s1[i--] - '0' - borrow;
if (sum < 0)
{
borrow = 1;
sum += 10;
res[k--] = sum + '0';
}
else{
borrow = 0;
res[k--] = sum + '0';
}
}
if (res[0] == '0')
{
//ignore the prefix '0's
int index = 1;
while(index < res.size() && res[index] == '0')
index++;
if (negative)
{
return "-" + res.substr(index, res.size() - index);
}
else return res.substr(index, res.size() - index);
}
else {
if (negative)
{
return "-" + res;
}
else return res;
}
} string BigIneger(string s1, string s2)
{
if (s1 == "")
{
return s2;
}
if (s2 == "")
{
return s1;
} char sign1 = '+', sign2 = '+';
if (s1[0] == '-')
{
sign1 = '-';
}
if (s2[0] == '-')
{
sign2 = '-';
}
if (sign1 == '+' && sign2 == '+')
{
return BigInegerAdd(s1, s2);
}
else if (sign1 == '+' && sign2 == '-')
{
return BigInegerMinus(s1, s2.substr(1, s2.size()-1),false);
}
else if (sign1 == '-' && sign2 == '+')
{
return BigInegerMinus(s2, s1.substr(1, s1.size()-1), false);
}
else {
string tmp = BigInegerAdd(s1.substr(1, s1.size()-1), s2.substr(1, s2.size()-1));
if (tmp[0] == '0')
{
tmp = tmp.substr(1, tmp.size()- 1);
}
string res = "-" + tmp;
return res;
}
} int main()
{
string s1 = "-789546321", s2 = "-15462897444";
cout<<BigIneger(s1,s2)<<endl;
return 0;
}

最新文章

  1. 俄罗斯方块(Win32实现,Codeblocks+GCC编译)
  2. VTID配置
  3. WebApi系列~在WebApi中实现Cors访问
  4. 常用eclipse 快捷键
  5. SpringMVC静态资源处理[转]
  6. 【JavaScript】JavaScript的Function与Object浅析
  7. CAD格式DWF嵌入到自己的网页中展示--Autodesk Design Review
  8. Web开发从零单排之二:在自制电子请帖中添加留言板功能,SAE+PHP+MySql
  9. 【剑指offer】q50:树节点最近的祖先
  10. Linux之初体验
  11. Openjudge-NOI题库-字符串移位包含问题
  12. 多年iOS开发经验总结
  13. hadoop更改保存路径后,批量重启不能启动datanode(或者format以后不能启动datanode)
  14. liteUploader上传控件的封装使用
  15. P1064 金明的预算方案
  16. python 图片相似度
  17. Msf提权步骤
  18. Linux LAMP 配置
  19. Android蓝牙通信功能开发
  20. java的第一个实验

热门文章

  1. ZingChart 图表插件
  2. hdu2046
  3. 九度oj 题目1352:和为S的两个数字
  4. Codeforces Round #360 (Div. 2)——C. NP-Hard Problem(BFS染色判二分图)
  5. [luoguP2219] [HAOI2007]修筑绿化带(单调队列)
  6. java面试题之Thread的run()和start()方法有什么区别
  7. VirtualBox 5.0.10 中 Fedora 23 在安装了增强工具后无法自动调节虚拟机分辨率的问题(改)
  8. R 包安装、载入和卸载
  9. java list实现树形结构
  10. oracle内核学习总结