bigNum(大整数)

来源:互联网 发布:下载mt4交易软件 编辑:程序博客网 时间:2024/06/05 08:31

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

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

#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 0