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的算法实现.算法实现是基于网上提供的一个大整 ...
随机推荐
- mysql replication常见错误整理
这篇文章旨在记录MySQL Replication的常见错误,包括自己工作中遇到的与网友在工作中遇到的,方面自己及别人以后进行查找.每个案例都是通过Last_IO_Errno/Last_IO_Erro ...
- Centos7 编译安装python3
step1:preparation $ yum install yum-utils make wget gcc $yum-builddep python step2:download $ wget h ...
- Oracle学习笔记整理手册
文章目录(1)Oracle正则匹配使用(2)Oracle修改有数据的数据字段类型(3)Oracle表数据回滚语句(4)sql筛选出记录数大于2的记录(5)oracle同义词(6)oracle内外连接( ...
- BZOJ2741 【FOTILE模拟赛】L 【可持久化trie + 分块】
题目 FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor Aj) ...
- Redis的数据类型及相关操作命令
redis 基础内容 —— redis的数据类型及相关操作的Linux命令.所谓大厦千层基础承载,希望大家认真学习这一讲: 一.redis 的五大数据类型: 1.String(字符串): 2.List ...
- EC++学习笔记(六) 继承和面向对象设计
条款32:确定你的 public 继承塑模出 is-a 关系 public inheritance 意味着 is-a 关系class Derived 以 public 形式继承 class Base, ...
- 洛谷 [P1939] 矩阵加速数列
矩阵快速幂模版 #include <iostream> #include <cstring> #include <cstdlib> #include <alg ...
- Java远程调用BPS流程实现流程运行简单示例
1.简介:略 2.背景:略 3.目的:自我学习笔记 4.实现过程 (1).画出流程图 如下: 路由活动分支下的条件语句为复杂表达式: ((account<200&&divisio ...
- (转)java 中变量存储位置总结
1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符 ...
- AC日记——最大子段和 洛谷 P1115
题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 输入文件maxsum1.in的第一行是一个正整数N,表示了序列的长度. 第2行包含N个绝对值不大于10000 ...