大数加法模板

#include <iostream>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;
#define fre freopen("/Users/LinkRay/Desktop/in.txt","r",stdin);//每个人的路径都不同,别照搬

const int MAXN = 10000+10;

// 用结构体进行了包装,不懂原理也可使用
// BigInt A 初始一个A的结构体
// A.read(字符串)  把字符串类型的数字放入A中
// 这里假设B也是一个BigInt  C = A+B, C为A+B的值
// print为输出结果,用法为 C.print()
struct BigInt{
    int num[MAXN];//大小可以根据所需修改MAXN
    int len;
    BigInt(){
        memset(num, 0, sizeof(num));
        len = 0;
    }

    BigInt operator + (const BigInt& r)const{ //进行加法,对+号进行了重载,可以直接用A+B
        int maxLen = max(len, r.len);//取最长的数
        BigInt res;
        res.len = maxLen;
        int jinwei = 0;
        for(int i = 0; i < maxLen; ++i){
            int tmp = num[i] + r.num[i];
            tmp += jinwei;
            jinwei = 0;
            if(tmp >= 10){
                jinwei = 1;
                tmp %= 10;
            }
            res.num[i] = tmp;
        }
        if(jinwei){ // 如果最后还有进位,则需扩展一个1
            res.num[len] = 1;
            res.len++;//长度也要对应加1
        }
        return res;
    }
    void read(string& s){//把字符串放到BigInt中
        int slen = s.length();
        len = slen;
        int p = 0;
        for(int i = slen-1; i >= 0; --i){
            num[p++] = s[i]-'0';
        }    
    }
    void read(char* s){//和上一个一样,上一个用来处理string类型
        int slen = strlen(s);
        len = slen;
        int p = 0;
        for(int i = slen-1; i >= 0; --i){
            num[p++] = s[i]-'0';
        }    
    }
    void print(){//打印,可以去除前导0
        int i;
        for(i = len-1; i >= 0; --i)
            if(num[i] != 0)
                break;
        for(; i >= 0; --i)
            cout << num[i];
    }

};
int main(){
//    fre;
    string num1, num2;
    //用法实例
    while(cin >> num1 >> num2){
        BigInt A, B;
        A.read(num1); //读取
        B.read(num2);
        BigInt C = A+B; 
        C.print();
        cout << endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值