bigNum(大整数)

其实这篇博客挺没有营养的,大整数算一个正式的算法么?不算吧,只是模拟了手动计算的过程而已。其中需要的注意的就是进制问题和进位问题。

下面的代码甚是丑陋,还请各位不吝赐教!

#include <iostream>
#include <vector>
using namespace std;
class bigNum{
public:
    vector<int> vec;
    bigNum();
    bigNum(string str);
    bigNum(int num);
    string toString() const;
    bigNum operator + (const bigNum &a) const;
    bigNum operator * (const bigNum &a) const;
    bool operator == (const bigNum &a) const;
    friend istream& operator >> (istream &in, bigNum &a);
    friend ostream& operator << (ostream &out, bigNum &a);
};
bigNum::bigNum() {
    vec.push_back(0);
}
bigNum::bigNum(string str) {
    for (int i = str.size(); i >= 0; i -= 4) {
        int t = 0;
        for (int j = max(i - 4, 0); j < i; ++j) {
            t = t * 10 + str[j] - '0';
        }
        vec.push_back(t);
    }
}
bigNum::bigNum(int num) {
    while (num) {
        vec.push_back(num % 10000);
        num /= 10000;
    }
}
bigNum bigNum::operator + (const bigNum &a) const {
    bigNum b;
    b.vec.clear();
    int t = 0;
    for (int i = 0, j = 0; i < this->vec.size() || j < a.vec.size(); ++i, ++j) {
        if (i < this->vec.size() && j < a.vec.size()) t += this->vec[i] + a.vec[j];
        else if (i >= this->vec.size()) t += a.vec[j];
        else t += this->vec[i];
        b.vec.push_back(t % 10000);
        t /= 10000;
    }
    if (t) b.vec.push_back(t);
    return b;
}
bigNum bigNum::operator * (const bigNum &a) const {
    bigNum b;
    for (int i = 0; i < this->vec.size(); ++i) {
        for (int j = 0; j < a.vec.size(); ++j) {
            if (i + j >= b.vec.size()) b.vec.push_back(this->vec[i] * a.vec[j]);
            else b.vec[i + j] += this->vec[i] * a.vec[j];
        }
        int t = 0;
        for (int j = 0; j < b.vec.size(); ++j) {
            if (b.vec[j] / 10000 && j + 1 != b.vec.size()) b.vec[j + 1] += b.vec[j] / 10000;
            else if (b.vec[j] / 10000) b.vec.push_back(b.vec[j] / 10000);
            b.vec[j] %= 10000;
        }
    }
    while (b.vec.size() > 1 && b.vec[b.vec.size() - 1] == 0) b.vec.pop_back();
    return b;
}
string bigNum::toString() const {
    string ans;
    for (int i = vec.size() - 1; i >= 0; --i) {
        int t = vec[i];
        string str;
        while (t) {
            str += t % 10 + '0';
            t /= 10;
        }
        if (str == "") str += '0';
        while (i != vec.size() - 1 && str.size() < 4) str += '0';
        for (int j = str.size() - 1; j >= 0; --j) ans += str[j];
    }
    return ans;
}
bool bigNum::operator == (const bigNum &a) const {
    return this->toString() == a.toString();
}
istream& operator >> (istream &in, bigNum &a) {
    string t;
    in >> t;
    bigNum b(t);
    a = b;
    return in;
}
ostream& operator << (ostream &out, bigNum &a) {
    out << a.toString();
    return out;
}
int main() {
    bigNum a("5000"), b(2000000);
    bigNum c = a * b;
    cout << c << endl;
    c = a + b;
    cout << c << endl;
    cin >> a >> b;
    c = a + b * a;
    cout << c << endl;
    return 0;
}


代码大致是写完了,以后有时间会慢慢升级更新的,因为有写地方还有待优化。

还有,不支持负数、减法、乘法、位运算,本来想一并写了的,不过感觉过于麻烦,还是留到今后有空的时候再更新吧,注释也留到以后更新的时候再写吧。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值