高精度算法

当遇到一些数据范围超大的毒瘤题时(如1\le N\le 10^{50}),一般需要使用高精度进行计算。

今天,本蒟蒻花了两个小时写成了c++程序,在这儿。欢迎大家阅读和评论(喷)!如果有错,请及时提出哦!^_^

如果你不想点任何链接,可以往下看我的c++程序。

#include <bits/stdc++.h>
using namespace std;
struct hpint {
    string val;
};
void check(hpint x) {
    for (char i : x.val) {
        if (!isdigit(i)) {
            cout << "Math Error: High Precision Integer is negative or it is not a number.\n";
            exit(1);
        }
    }
}
bool operator< (hpint a, hpint b) {
    check(a);
    check(b);
    string aval = a.val, bval = b.val;
    return aval.size() < bval.size() || (aval.size() == bval.size() && aval < bval);
}
bool operator> (hpint a, hpint b) {
    check(a);
    check(b);
    string aval = a.val, bval = b.val;
    return aval.size() > bval.size() || (aval.size() == bval.size() && aval > bval);
}
bool operator== (hpint a, hpint b) {
    check(a);
    check(b);
    return a.val == b.val;
}
hpint operator- (hpint a, hpint b) {
    if (a < b) {
        cout << "Math Error: High Precision Integer is negative or it is not a number.\n";
        exit(1);
    }
    check(a);
    check(b);
    string aval = a.val, bval = b.val;
    string ret;
    int j = (int)aval.size(), abd = 0;
    for (int i = bval.size(); i --; ) {
        j --;
        if (aval[j] - '0' - bval[i] + '0' - abd < 0) {
            ret += aval[j] - '0' + 10 - bval[i] + '0' - abd + '0';
            abd = 1;
        } else {
            ret += aval[j] - '0' - bval[i] + '0' - abd + '0';
            abd = 0;
        }
    }
    for (; j --; ) {
        if (aval[j] - '0' - abd < 0) {
            ret += aval[j] - '0' + 10 - abd + '0';
            abd = 1;
        } else {
            ret += aval[j] - '0' - abd + '0';
            abd = 0;
        }
    }
    while ((int)ret.size() > 1 && ret.back() == '0') {
        ret.pop_back();
    }
    reverse(ret.begin(), ret.end());
    hpint ret2;
    ret2.val = ret;
    return ret2;
}
hpint operator+ (hpint a, hpint b) {
    check(a);
    check(b);
    string aval = a.val, bval = b.val;
    if (a > b) {
        swap(aval, bval);
    }
    string ret;
    int car = 0;
    int j = bval.size();
    for (int i = aval.size(); i --; ) {
        j --;
        ret += (aval[i] - '0' + bval[j] - '0' + car) % 10 + '0';
        car = (aval[i] - '0' + bval[j] - '0' + car) / 10;
    }
    for (; j --; ) {
        ret += (bval[j] - '0' + car) % 10 + '0';
        car = (bval[j] - '0' + car) / 10;
    }
    if (car) {
        ret += to_string(car);
    }
    reverse(ret.begin(), ret.end());
    if ((int)ret.size() == 0) {
        ret = "0";
    }
    hpint ret2;
    ret2.val = ret;
    return ret2;
}
hpint operator* (hpint a, hpint b) {
    check(a);
    check(b);
    string aval = a.val, bval = b.val;
    if (a < b) {
        return b * a;
    }
    hpint ret;
    ret.val = "0";
    for (int i = bval.size(); i --; ) {
        hpint cur;
        cur.val = "0";
        for (int j = 0; j < bval[i] - '0'; j ++) {
            cur = cur + a;
        }
        for (int j = 0; j < (int)bval.size() - 1 - i; j ++) {
            cur.val += "0";
        }
        ret = ret + cur;
    }
    return ret;
}
hpint operator/ (hpint a, hpint b) {
    check(a);
    check(b);
    int i = 0;
    string aval = a.val, bval = b.val, ret;
    hpint rem;
    rem.val = "";
    while (i < (int)aval.size()) {
        while (i < (int)aval.size() && rem < b) {
            rem.val += aval[i];
            i ++;
        }
        hpint temp;
        temp.val = "0";
        while (b * temp < rem || b * temp == rem) {
            hpint one;
            one.val = "1";
            temp = temp + one;
        }
        hpint one;
        one.val = "1";
        temp = temp - one;
        ret += temp.val;
        rem = rem - b * temp;
        if (rem.val == "0") {
            rem.val = "";
        }
    }
    hpint ret2;
    ret2.val = ret;
    return ret2;
}
hpint operator% (hpint a, hpint b) {
    check(a);
    check(b);
    return a - a / b * b;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值