您的位置:首页 > 编程语言 > C语言/C++

大整数类BigInteger

2015-08-09 16:07 429 查看
参考资料:《算法竞赛入门经典》
使用C++实现大整数类,并重载了大整数类的=、>>、<<、<、>、+等操作符。
#include <iostream>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>

using namespace std;

struct BigInteger
{
    static const int BASE = 100000000;
    static const int WIDTH = 8;
    vector<int> s;

    BigInteger operator = (long long num)
    {
        s.clear();
        do
        {
            s.push_back(num%BASE);
            num /= BASE;
        }while(num);
        return *this;
    }

    BigInteger operator = (const string &str)
    {
        s.clear();
        int x,len = (str.length()-1) / WIDTH + 1;
        for(int i = 0; i < len; i++)
        {
            int end = str.length() - i * WIDTH;
            int begin = max(0, end - WIDTH);
            sscanf(str.substr(begin,end - begin).c_str(), "%d", &x);
            s.push_back(x);
        }
        return *this;
    }

    friend ostream& operator << (ostream &out,const BigInteger &x)
    {
        out << x.s.back();
        for(int i = x.s.size() - 2; i >=0; i--)
        {
            char buf[20];
            sprintf(buf,"%08d",x.s[i]);
            for(int j = 0; j < strlen(buf); j++) out << buf[j];
        }
        return out;
    }

    friend istream& operator >> (istream &in,BigInteger &x)
    {
        string s;
        if(!(in >> s)) return in;
        x = s;
        return in;
    }

    BigInteger operator + (const BigInteger& b) const
    {
        BigInteger c;
        c.s.clear();
        for(int i = 0, g = 0; ; i++)
        {
            if(g == 0 && i >= s.size() && i >= b.s.size()) break;
            int x = g;
            if(i < s.size()) x += s[i];
            if(i < b.s.size()) x += b.s[i];
            c.s.push_back(x % BASE);
            g = x / BASE;
        }
        return c;
    }

    BigInteger operator += (const BigInteger &b)
    {
        *this = *this + b;
        return *this;
    }

    bool operator < (const BigInteger &b) const
    {
        if(s.size() != b.s.size()) return s.size() < b.s.size();
        for(int i = s.size() - 1; i >= 0; i--)
        {
            if(s[i] != b.s[i]) return s[i] < b.s[i];
        }
        return false;
    }

    bool operator > (const BigInteger &b) const
    {
        return *this > b;
    }
};

int main()
{
    BigInteger x;
    cin >> x;
    cout << x << endl;

    int num = 10;
    x = num;
    cout << x << endl;

    string str = "111";
    x = str;
    cout << x << endl;

    BigInteger x1;
    x1 = "321312321321313";

    BigInteger x2 = x + x1;
    cout << x2;

    return 0;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 运算符重载