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

#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 实现大整数相加减的更多相关文章

  1. 大整数加减运算的C语言实现

    目录 大整数加减运算的C语言实现 一. 问题提出 二. 代码实现 三. 效果验证 大整数加减运算的C语言实现 标签: 大整数加减 C 一. 问题提出 培训老师给出一个题目:用C语言实现一个大整数计算器 ...

  2. HDU 1002 A + B Problem II(大整数相加)

    A + B Problem II Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u De ...

  3. SOJ 1002/1003/1004 大整数相加/相乘/相除

    三个题目分别考察大整数相加相乘相除运算.如果按照传统算法是取一个长数组,之后进行模拟或者FFT来进行运算.但是相对繁琐. 后来昨天的青岛区域赛网赛1001,用到了JAVA的BigDecimal,于是反 ...

  4. 华为"128为大整数相加"机试题

    最近正直春招,偶尔接触到了华为的这道大整数相加的测试题,在网上找了一个算法,然后自己尝试进行了优化,最后也对memmove()函数效率有了进一步把握. #include <time.h># ...

  5. HDOJ-1002 A + B Problem II (非负大整数相加)

    http://acm.hdu.edu.cn/showproblem.php?pid=1002 输入的数都是正整数,比较好处理,注意进位. //非负大整数加法 # include <stdio.h ...

  6. 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 ...

  7. 大整数相加 a+b 的c语言实现

    终于来到我所期盼的高精度整数相加的题目了.这个题很经典,也算是一个很好的算法入门题吧. 如果是java的话,系统类库已经内置了BigInteger类,直接调用就可以很轻易地解决了.但是学习c的编写也是 ...

  8. JavaScript大位数相加减

    function arrayAdd(number, addNumber) { var numberArr = number.toString().split(''); var addNumberArr ...

  9. C# 基于大整数类的RSA算法实现(公钥加密私钥解密,私钥加密公钥解密)

    但是C#自带的RSA算法类RSACryptoServiceProvider只支持公钥加密私钥解密,即数字证书的使用. 所以参考了一些网上的资料写了一个RSA的算法实现.算法实现是基于网上提供的一个大整 ...

随机推荐

  1. Python paramiko模块 + 堡垒机

    paremiko SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: import paramiko    # 创建SSH对象 ssh = paramiko.SSHClient ...

  2. Spring注解@Component、@Repository、@Service、@Controller

    @Service用于标注业务层组件 @Controller用于标注控制层组件(如struts中的action) @Repository用于标注数据访问组件,即DAO组件 @Component泛指组件, ...

  3. Windows phone UI虚拟化和数据虚拟化(二)

    书接上回的Windows phone UI虚拟化和数据虚拟化(一)我们学习了wp的ui虚拟化.今天来和大家分享一下wp的数据虚拟化. 并同时感谢我的同事dgwutao在编写此文时给我的巨大帮助,3ks ...

  4. NYOJ 104 最大和

    最大和 时间限制:1000 ms  |  内存限制:65535 KB 难度:5   描述 给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个 ...

  5. zoj 2830 Champion of the Swordsmanship

    Champion of the Swordsmanship Time Limit: 2 Seconds      Memory Limit: 65536 KB In Zhejiang Universi ...

  6. 使用sudo,mvn command not found

    一个简单的解决办法是,编辑你当前用户的 .bashrc 文件,添加下面这行内容: alias sudo="sudo env PATH=$PATH" 因为系统预装的 sudo 在编译 ...

  7. uva 11235 RMQ范围最大值

    题目大意:给一个整数上升序列,对于一系列询问区间(i,j),回答这段区间出现次数最多值所出现的次数. 分析:一个上升序列,相同的值聚集在一起,把相同的值的区间看作一个整体,假设这样的整体有n个,把他们 ...

  8. android开发里跳过的坑——TimePickerDialog onTimeSet不回调

    在android6.0.1上测试发现TimePickerDialog的onTimeSet和DatePickerDialog的onDateSet不回调,查看SDK源码发现,TimePickerDialo ...

  9. net3:文件上传与图片显示以及HiddenField隐藏字段值的使用

    原文发布时间为:2008-07-29 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Data;using System.Configuration ...

  10. 在App_Data中创建数据库获取连接串简便方法!

    原文发布时间为:2008-07-25 -- 来源于本人的百度文章 [由搬家工具导入] 1、在App_Data右击添加一个SQL数据库2、双击该数据库,在左边添加表,并显示表数据进行添加数据3、把刚刚创 ...