[C++][题解]A+B Problem(高精)

48 篇文章 4 订阅

题目

题目描述

高精度加法,相当于a+b problem,不用考虑负数.

输入格式

分两行输入。 a , b ≤ 1 0 500 a,b \leq 10^{500} a,b10500

输出格式

输出只有一行,代表 a + b a+b a+b的值

题解

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
class BigInt{
private:
    string num; // 将大整数存在一个string对象里,整数的个位存在num[0]的位置。
public:
    BigInt(){num = "0";};
    const BigInt operator+ (const BigInt a)const;   // 重载加法运算符
    friend istream& operator>>(istream& in,BigInt &a);  // 重载左移运算符
    friend ostream& operator<<(ostream& out,const BigInt &a); // 重载右移运算符
};
const BigInt BigInt::operator+ (const BigInt a)const{
    BigInt s;
    string num;
    int k = 0;  // 进位
    int i;
    for(i = 0;i < this->num.length() && a.num.length();i++){
        int t = (this->num[i] - '0') + (a.num[i] - '0') + k;
        k = 0;
        if(t >= 10){
            k = 1;
            t %= 10;
        }
        num += t + '0';
    }
    for(;i < this->num.length();i++){
        int t = this->num[i] - '0' + k;
        k = 0;
        if(t >= 10){
            k = 1;
            t %= 10;
        }
        num += t + '0';
    }
    for(;i < a.num.length();i++){
        int t = a.num[i] - '0' + k;
        k = 0;
        if(t >= 10){
            k = 1;
            t %= 10;
        }
        num += t + '0';
    }
    if(k != 0)
        num += '1';
    s.num = num;
    return s;
}
istream& operator>>(istream& in,BigInt &a){
    in >> a.num;
    reverse(a.num.begin(),a.num.end());
    return in;
}
ostream& operator<<(ostream& out,const BigInt &a){
    string num(a.num);
    reverse(num.begin(),num.end());
    out << num;
    return out;
}

int main(){
    BigInt a,b; // 重载后的BigInt对象可以像int型变量一样直接进行加法运算和输入输出。
    cin >> a >> b;
    cout << a + b << endl;
    return 0;
}
5至13行
class BigInt{
private:
    string num; // 将大整数存在一个string对象里,整数的个位存在num[0]的位置。
public:
    BigInt(){num = "0";};
    const BigInt operator+ (const BigInt a)const;   // 重载加法运算符
    friend istream& operator>>(istream& in,BigInt &a);  // 重载左移运算符
    friend ostream& operator<<(ostream& out,const BigInt &a); // 重载右移运算符
};

这里定义了一个大整数类。
因为本题的整数数值可能很大,使用intlong long都不能进行存储。
在C/C++的基本数据类型中,int类型的取值始终有上限。
所以在遇到这种需要超大整数的情况时,就得自己定义一个大整数类了。

因为本题需要对大整数进行输入输出和加法运算,所以分别重载了右移>>、左移<<、加法+运算符。

第9行
BigInt(){num = "0";};

这里是对BigInt类的构造函数的定义。
当在64行定义BigInt对象ab时,

BigInt a,b;

a、b两个对象会分别调用该构造函数,将自身的数值初始化为0。

14至50行
const BigInt BigInt::operator+ (const BigInt a)const{
    BigInt s;
    string num;
    int k = 0;  // 进位
    int i;
    for(i = 0;i < this->num.length() && a.num.length();i++){
        int t = (this->num[i] - '0') + (a.num[i] - '0') + k;
        k = 0;
        if(t >= 10){
            k = 1;
            t %= 10;
        }
        num += t + '0';
    }
    for(;i < this->num.length();i++){
        int t = this->num[i] - '0' + k;
        k = 0;
        if(t >= 10){
            k = 1;
            t %= 10;
        }
        num += t + '0';
    }
    for(;i < a.num.length();i++){
        int t = a.num[i] - '0' + k;
        k = 0;
        if(t >= 10){
            k = 1;
            t %= 10;
        }
        num += t + '0';
    }
    if(k != 0)
        num += '1';
    s.num = num;
    return s;
}

这是BigInt类加法运算的具体定义。
主体为三个for循环。
因为两个数可能存在位数的差别,所以使用第一个for循环计算两个数都存在数位的部分,第二第三个循环计算高出的位数部分。
如图所示。
在这里插入图片描述

第51至61行
istream& operator>>(istream& in,BigInt &a){
    in >> a.num;
    reverse(a.num.begin(),a.num.end());
    return in;
}
ostream& operator<<(ostream& out,const BigInt &a){
    string num(a.num);
    reverse(num.begin(),num.end());
    out << num;
    return out;
}

这里要注意对位数进行反转,使得最低位位于下标0的位置(这样方便了加法时向高位进位)。

输入输出的重载虽然看着很复杂,但它的定义基本上都是同一个形式,熟练之后写起来并不难。
可参考资料:C++ 输入/输出运算符重载

补充

在python和java中,对于大整数问题有自己的优势。

python
python的整数类型无取值上限,所以不用自己定义类。
因此对于python,这道题3行代码即可解决:

a = int(input())
b = int(input())
print(a + b)

java
在java中,预置了一个BigInteger类,直接引入使用即可,同样不需要自己定义。

import java.io.*;
import java.util.*;
import java.math.BigInteger;
public class Main {
    public static void main(String []args) {
       Scanner s = new Scanner(System.in);
       BigInteger a = new BigInteger(s.next());
	   BigInteger b = new BigInteger(s.next());
	   s.close();
  	   System.out.print(a.add(b).toString());
    }
}

原创不易,感谢支持。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wingaso

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值