51Nod--1005 大数加法

题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1005

基准时间限制:1 秒 空间限制:131072 KB 分值: 0

给出2个大整数A,B,计算A+B的结果。
Input
第1行:大数A
第2行:大数B
(A,B的长度 <= 10000 需注意:A B有可能为负数)
Output
输出A + B
Input示例
68932147586
468711654886
Output示例
537643802472

其实就是模拟我们在草稿纸上进行加减运算的过程,关键点在代码中给出了注释,代码使用了一些面向对象的性质:




#include <iostream>
#include <string>
#include <cmath>
using namespace std; 

struct BigNumber {
    // 初始化,处理负数 
    void init() {
        if(this->str[0] == '-') {
            isPos = false;
            this->str.erase(this->str.begin(), this->str.begin()+1);
        } else {
            isPos = true;
        }
        length = str.length();
    }
    // 两个大整数相加的函数 
    string &add(BigNumber &other) {
        // 在位数短的那一个数前面补零,使两者位数相等 
        int diff = abs(other.length - this->length);
        other.length > this->length ? this->str.insert(0, diff, '0') : other.str.insert(0, diff, '0');
        // 两个正数或者两负,两负,就是两正数相加,符号为负 
        if(this->isPos && other.isPos || !this->isPos && !other.isPos) {
            for(int i = str.length()-1; i >= 0; i--) {
                str[i] += other.str[i] - '0';
                // 如果和大于字符 9,即为 10 以上,那么进位 
                if(str[i] > '9') {
                    // 如果是左边第一位数,那么注意处理进位 
                    if(i == 0) {
                        str.insert(0, 1, (str[i]-'0')/10+'0');
                        str[1] = '0' + (str[1]-'0')%10;
                    } else {
                        str[i-1] += (str[i]-'0')/10;
                        str[i] = '0' + (str[i]-'0')%10;
                    }
                    str[i] = '0' + (str[i]-'0')%10;
                }
            }
            // 一正一负相加,即为两数绝对值相减,符号为绝对值大的那个 
        } else {
            // 找出两个中绝对值较大的那个,如果不是this->str,那么交换 
            for(int i = 0; i < str.length(); i++) {
                if(str[i] < other.str[i]) {
                    this->str.swap(other.str);
                    // 更新结果正负 
                    this->isPos = other.isPos;
                    break;
                } else if(str[i] > other.str[i]) {
                    break;
                }
            }
            for(int i = str.length()-1; i >= 0; i--) {
                str[i] -= other.str[i] - '0';
                // 不够减则向左边一位数借 1  
                if(str[i] < '0') {
                    str[i] += 10;
                    str[i-1]--;
                }
            }
        }
        // 清除结果前面多余的 0  
        int zeroNum;
        for(zeroNum = 0; zeroNum < str.length(); zeroNum++) {
            if(str[zeroNum] != '0') {
                break;
            }
        }
        str.erase(str.begin(), str.begin()+zeroNum);
        // 如果结果是负数,那么开头加负号 
        if(!this->isPos) {
            this->str.insert(0, 1, '-');
        }
        // 还需要注意的是如果本身答案就是 0 的情况 
        if(str.length() == 0) {
            str.append(1, '0');
        }
        return str;
    }

    string str;
    int length;
    // 是否为正数 
    bool isPos;
};


int main() {
    BigNumber a, b;
    cin >> a.str >> b.str;
    a.init();
    b.init();

    cout << a.add(b) << endl;

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值