zoukankan      html  css  js  c++  java
  • C++大数模板

    #include<bits/stdc++.h>
    
    //大整数
    struct BigInteger {
        static const int BASE = 100000000;//和WIDTH保持一致
        static const int WIDTH = 8;//八位一存储,如修改记得修改输出中的%08d
        bool sign;//符号, 0表示负数
        size_t length;
        std::vector<int> num;//反序存
    //构造函数
        BigInteger(long long x = 0) { *this = x; }
        BigInteger(const std::string &x) { *this = x; }
        BigInteger(const BigInteger &x) { *this = x; }
    
    //剪掉前导0
        void cutLeadingZero() {
            while (num.back() == 0 && num.size() != 1) { num.pop_back(); }
        }
    
    //设置数的长度
        void setLength() {
            cutLeadingZero();
            int tmp = num.back();
            if (tmp == 0) { length = 1; }
            else {
                length = (num.size() - 1) * WIDTH;
                while (tmp > 0) {
                    ++length;
                    tmp /= 10;
                }
            }
        }
    
    //赋值运算符
        BigInteger &operator=(long long x) {
            num.clear();
            if (x >= 0) sign = true;
            else {
                sign = false;
                x = -x;
            }
            do {
                num.emplace_back(x % BASE);
                x /= BASE;
            } while (x > 0);
            setLength();
            return *this;
        }
    
    //赋值运算符
        BigInteger &operator=(const std::string &str) {
            num.clear();
            sign = (str[0] != '-');//设置符号
            int x, len = (str.size() - 1 - (!sign)) / WIDTH + 1;
            for (int i = 0; i < len; i++) {
                int End = str.length() - i * WIDTH;
                int start = std::max((int) (!sign), End - WIDTH);//防止越界
                sscanf(str.substr(start, End - start).c_str(), "%d", &x);
                num.push_back(x);
            }
            setLength();
            return *this;
        }
    
    //赋值运算符
        BigInteger &operator=(const BigInteger &tmp) {
            num = tmp.num;
            sign = tmp.sign;
            length = tmp.length;
            return *this;
        }
    
    
    //数的位数
        size_t size() const { return length; }
    
    //*10^n 除法中用到
        BigInteger e(size_t n) const {
            int tmp = n % WIDTH;
            BigInteger ans;
            ans.length = n + 1;
            n /= WIDTH;
            while (ans.num.size() <= n) ans.num.push_back(0);
            ans.num[n] = 1;
            while (tmp--) ans.num[n] *= 10;
            return ans * (*this);
        }
    
    //绝对值
        BigInteger abs() const {
            BigInteger ans(*this);
            ans.sign = true;
            return ans;
        }
    
    //正号
        const BigInteger &operator+() const { return *this; }
    
    // + 运算符
        BigInteger operator+(const BigInteger &b) const {
            if (!b.sign) { return *this - (-b); }
            if (!sign) { return b - (-*this); }
            BigInteger ans;
            ans.num.clear();
            for (int i = 0, g = 0;; i++) {
                if (g == 0 && i >= num.size() && i >= b.num.size()) break;
                int x = g;
                if (i < num.size()) x += num[i];
                if (i < b.num.size()) x += b.num[i];
                ans.num.push_back(x % BASE);
                g = x / BASE;
            }
            ans.setLength();
            return ans;
        }
    
    //负号
        BigInteger operator-() const {
            BigInteger ans(*this);
            if (ans != 0) ans.sign = !ans.sign;
            return ans;
        }
    
    // - 运算符
        BigInteger operator-(const BigInteger &b) const {
            if (!b.sign) { return *this + (-b); }
            if (!sign) { return -((-*this) + b); }
            if (*this < b) { return -(b - *this); }
            BigInteger ans;
            ans.num.clear();
            for (int i = 0, g = 0;; i++) {
                if (g == 0 && i >= num.size() && i >= b.num.size()) break;
                int x = g;
                g = 0;
                if (i < num.size()) x += num[i];
                if (i < b.num.size()) x -= b.num[i];
                if (x < 0) {
                    x += BASE;
                    g = -1;
                }
                ans.num.push_back(x);
            }
            ans.setLength();
            return ans;
        }
    
    // * 运算符
        BigInteger operator*(const BigInteger &b) const {
            int lena = num.size(), lenb = b.num.size();
            std::vector<long long> ansLL;
            for (int i = 0; i < lena + lenb; i++) ansLL.push_back(0);
            for (int i = 0; i < lena; i++) {
                for (int j = 0; j < lenb; j++) {
                    ansLL[i + j] += (long long) num[i] * (long long) b.num[j];
                }
            }
            while (ansLL.back() == 0 && ansLL.size() != 1) ansLL.pop_back();
            int len = ansLL.size();
            long long g = 0, tmp;
            BigInteger ans;
            ans.sign = (ansLL.size() == 1 && ansLL[0] == 0) || (sign == b.sign);
            ans.num.clear();
            for (int i = 0; i < len; i++) {
                tmp = ansLL[i];
                ans.num.emplace_back((tmp + g) % BASE);
                g = (tmp + g) / BASE;
            }
            if (g > 0) ans.num.emplace_back(g);
            ans.setLength();
            return ans;
        }
    
    // / 运算符 (大数除小数)
        BigInteger operator/(const long long &b) const {
            BigInteger c;
            c.num.clear();
            for (int i = 0; i < num.size(); i++) {
                c.num.push_back(0);
            }
            long long g = 0;
            for (int i = num.size() - 1; i >= 0; i--) {
                c.num[i] = int((num[i] + g * BASE) / b);
                g = num[i] + g * BASE - c.num[i] * b;
            }
            for (int i = num.size() - 1; c.num[i] == 0; i--) {
                c.num.pop_back();
            }
            return c;
        }
    
    // /运算符 (大数除大数)
        BigInteger operator/(const BigInteger &b) const {
            BigInteger aa((*this).abs());
            BigInteger bb(b.abs());
            if (aa < bb) return 0;
            char *str = new char[aa.size() + 1];
            memset(str, 0, sizeof(char) * (aa.size() + 1));
            BigInteger tmp;
            int lena = aa.length, lenb = bb.length;
            for (int i = 0; i <= lena - lenb; i++) {
                tmp = bb.e(lena - lenb - i);
                while (aa >= tmp) {
                    ++str[i];
                    aa = aa - tmp;
                }
                str[i] += '0';
            }
            BigInteger ans(str);
            delete[]str;
            ans.sign = (ans == 0 || sign == b.sign);
            return ans;
        }
    
    // % 运算符 (大数取模小数)
        BigInteger operator%(const long long &b) const {
            long long ans = 0;
            for (int i = num.size() - 1; i >= 0; i--)
                ans = (ans * BASE + num[i]) % b;
            return ans;
        }
    
    // %运算符 (大数取模大数)
        BigInteger operator%(const BigInteger &b) const {
            return *this - *this / b * b;
        }
    
        BigInteger &operator++() {
            *this = *this + 1;
            return *this;
        } // ++ 运算符
        BigInteger &operator--() {
            *this = *this - 1;
            return *this;
        } // -- 运算符
        BigInteger &operator+=(const BigInteger &b) {
            *this = *this + b;
            return *this;
        } // += 运算符
        BigInteger &operator-=(const BigInteger &b) {
            *this = *this - b;
            return *this;
        } // -= 运算符
        BigInteger &operator*=(const BigInteger &b) {
            *this = *this * b;
            return *this;
        } // *=运算符
        BigInteger &operator/=(const long long &b) {
            *this = *this / b;
            return *this;
        } // /=运算符
        BigInteger &operator/=(const BigInteger &b) {
            *this = *this / b;
            return *this;
        } // /= 运算符
        BigInteger &operator%=(const long long &b) {
            *this = *this % b;
            return *this;
        } // %=运算符
        BigInteger &operator%=(const BigInteger &b) {
            *this = *this % b;
            return *this;
        } // %=运算符
    // < 运算符
        bool operator<(const BigInteger &b) const {
            if (sign && !b.sign) { return false; }//正负
            else if (!sign && b.sign) { return true; }//负正
            else if (!sign && !b.sign) { return -b < -*this; }//负负
            //正正
            if (num.size() != b.num.size()) return num.size() < b.num.size();
            for (int i = num.size() - 1; i >= 0; i--)
                if (num[i] != b.num[i]) return num[i] < b.num[i];
            return false;
        }
    
        bool operator>(const BigInteger &b) const { return b < *this; }              // >  运算符
        bool operator<=(const BigInteger &b) const { return !(b < *this); }           // <= 运算符
        bool operator>=(const BigInteger &b) const { return !(*this < b); }           // >= 运算符
        bool operator!=(const BigInteger &b) const { return b < *this || *this < b; }     // != 运算符
        bool operator==(const BigInteger &b) const { return !(b < *this) && !(*this < b); }//==运算符
    
        bool operator||(const BigInteger &b) const { return *this != 0 || b != 0; } // || 运算符
        bool operator&&(const BigInteger &b) const { return *this != 0 && b != 0; } // && 运算符
        bool operator!() { return (bool) (*this == 0); }                            // ! 运算符
    
        //重载<<使得可以直接输出大数
        friend std::ostream &operator<<(std::ostream &out, const BigInteger &x) {
            if (!x.sign) out << '-';
            out << x.num.back();
            for (int i = x.num.size() - 2; i >= 0; i--) {
                char buf[10];
                //如WIDTH和BASR有变化,此处要修改为%0(WIDTH)d
                sprintf(buf, "%08d", x.num[i]);
                for (int j = 0; j < strlen(buf); j++) out << buf[j];
            }
            return out;
        }
    
        //重载>>使得可以直接输入大数
        friend std::istream &operator>>(std::istream &in, BigInteger &x) {
            std::string str;
            in >> str;
            size_t len = str.size();
            int start = 0;
            if (str[0] == '-') start = 1;
            if (str[start] == '') return in;
            for (int i = start; i < len; i++) {
                if (str[i] < '0' || str[i] > '9') return in;
            }
            x.sign = !start;
            x = str.c_str();
            return in;
        }
        BigInteger pow(int n) {
            BigInteger ans = 1, base = *this;
            while (n) {
                if (n & 1) ans = ans * base;
                base = base * base;
                n >>= 1;
            }
            return ans;
        }
    };
    
    int main() {
        BigInteger a, b;
        std::cin >> a >> b;
        std::cout << (a + b) << std::endl;
        return 0;
    }
    

      

  • 相关阅读:
    03 http请求协议与响应协议
    02 web应用程序
    Django web框架目录
    01 http协议
    Django框架
    Bootstrap栅格系统
    bootstrap介绍和引入
    Python中日志logging模块
    Python 装饰器实现单列模式
    Python 如何理解可更改元组中的可变序列
  • 原文地址:https://www.cnblogs.com/Accpted/p/11317308.html
Copyright © 2011-2022 走看看