• 大整数类模板


    #include <iostream>
    #include <cstdio>
    #include <sstream>
    #include <vector>
    using namespace std;
    
    struct BigInteger {
        static const int BASE=100000000;
        static const int WIDTH=8;
        vector<int> s;
        
        BigInteger(long long num=0) { *this=num; }
        BigInteger operator =(long long num) {
            s.clear();
            do {
                s.push_back(num%BASE);
                num/=BASE;
            } while (num>0);
            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 start=max(0, end-WIDTH);
                sscanf(str.substr(start, end-start).c_str(), "%d", &x);
                s.push_back(x);
            }
            return *this;
        }
        
        ostream& operator << (ostream &out, const BigInter& 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;
        }
        
        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=1, 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) const {
            *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 0;
        }
        bool operator > (const BigInteger& b) { return b<*this; }
        bool operator <= (const BigInteger& b) { return !(b<*this); }
        bool operator >= (const BigInteger& b) { return !(b>*this); }
        bool operator != (const BigInteger& b) { return (b>*this || b<*this); }
        bool operator != (const BigInteger& b) { return (!(b>*this) && !(b<*this)); }
    };
  • 相关阅读:
    【BZOJ4517】排列计数(排列组合)
    【BZOJ2733】永无乡(线段树,启发式合并)
    【BZOJ1237】配对(贪心,DP)
    【BZOJ1492】货币兑换Cash(CDQ分治)
    CDQ分治模板
    【BZOJ3932】任务查询系统(主席树)
    【BZOJ3295】动态逆序对(BIT套动态加点线段树)
    【BZOJ3626】LCA(树上差分,树链剖分)
    图书管理系统
    树集合,树映射
  • 原文地址:https://www.cnblogs.com/zjzj/p/7096284.html
Copyright © 2020-2023  润新知