C++ string 实现大整数相加减
随意两个大整数的加减算法。可自己主动推断正负号。代码例如以下:
#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;
}
C++ string 实现大整数相加减的更多相关文章
- 大整数加减运算的C语言实现
目录 大整数加减运算的C语言实现 一. 问题提出 二. 代码实现 三. 效果验证 大整数加减运算的C语言实现 标签: 大整数加减 C 一. 问题提出 培训老师给出一个题目:用C语言实现一个大整数计算器 ...
- HDU 1002 A + B Problem II(大整数相加)
A + B Problem II Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u De ...
- SOJ 1002/1003/1004 大整数相加/相乘/相除
三个题目分别考察大整数相加相乘相除运算.如果按照传统算法是取一个长数组,之后进行模拟或者FFT来进行运算.但是相对繁琐. 后来昨天的青岛区域赛网赛1001,用到了JAVA的BigDecimal,于是反 ...
- 华为"128为大整数相加"机试题
最近正直春招,偶尔接触到了华为的这道大整数相加的测试题,在网上找了一个算法,然后自己尝试进行了优化,最后也对memmove()函数效率有了进一步把握. #include <time.h># ...
- HDOJ-1002 A + B Problem II (非负大整数相加)
http://acm.hdu.edu.cn/showproblem.php?pid=1002 输入的数都是正整数,比较好处理,注意进位. //非负大整数加法 # include <stdio.h ...
- 1024 Palindromic Number int_string转换 大整数相加
A number that will be the same when it is written forwards or backwards is known as a Palindromic Nu ...
- 大整数相加 a+b 的c语言实现
终于来到我所期盼的高精度整数相加的题目了.这个题很经典,也算是一个很好的算法入门题吧. 如果是java的话,系统类库已经内置了BigInteger类,直接调用就可以很轻易地解决了.但是学习c的编写也是 ...
- JavaScript大位数相加减
function arrayAdd(number, addNumber) { var numberArr = number.toString().split(''); var addNumberArr ...
- C# 基于大整数类的RSA算法实现(公钥加密私钥解密,私钥加密公钥解密)
但是C#自带的RSA算法类RSACryptoServiceProvider只支持公钥加密私钥解密,即数字证书的使用. 所以参考了一些网上的资料写了一个RSA的算法实现.算法实现是基于网上提供的一个大整 ...
随机推荐
- 大数据学习——hive的sql练习题
ABC三个hive表 每个表中都只有一列int类型且列名相同,求三个表中互不重复的数 create table a(age int) row format delimited fields termi ...
- TOJ 2017: N-Credible Mazes
2017: N-Credible Mazes Time Limit(Common/Java):1000MS/10000MS Memory Limit:65536KByteTotal Subm ...
- gitlab简介配置和参数修改
一.Gitlab基本简介 GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,可通过Web界面进行访问公开的或者私人项目,非常适合在团队内部使用. 在gitlab中有三个版本, ...
- Access denied for user ''@'localhost' to database 'mysql'
ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mysql' 在centos下安装好了mysql,用r ...
- xcode错误-第三方的东西他不支持
ld:' /用户/ tanqihong /桌面/金粒子公司/金粒子公司/ Carloans / Carloans /第三/ TongLianPay / lib_release / libAPayLib ...
- 【Luogu】P3414组合数(快速幂)
题目链接 从n的元素中选零个,选一个,选两个,选三个...选n个的方案数和,其实就是n个元素中取任意多个元素的方案数,那对于每一个元素,都有取或不取两种情况,所以方案数最终为2^n个. #includ ...
- [UOJ#221][BZOJ4652][Noi2016]循环之美
[UOJ#221][BZOJ4652][Noi2016]循环之美 试题描述 牛牛是一个热爱算法设计的高中生.在他设计的算法中,常常会使用带小数的数进行计算.牛牛认为,如果在 k 进制下,一个数的小数部 ...
- [UOJ#128][BZOJ4196][Noi2015]软件包管理器
[UOJ#128][BZOJ4196][Noi2015]软件包管理器 试题描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管 ...
- BZOJ 4810 [Ynoi2017]由乃的玉米田 ——Bitset 莫队算法
加法和减法的操作都能想到Bitset. 然后发现乘法比较难办,反正复杂度已经是$O(n\log{n})$了 枚举因数也不能更差了,直接枚举就好了. #include <map> #incl ...
- 算法复习——网络流模板(ssoj)
题目: 题目描述 有 n(0<n<=1000)个点,m(0<m<=1000)条边,每条边有个流量 h(0<=h<35000),求从点 start 到点 end 的最 ...