zoukankan      html  css  js  c++  java
  • 高精度(大整数)运算重载运算符

    #include<cstdio>
    #include<cstring>
    #include<vector>
    #include<algorithm>
    #include<iostream>
    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;
        }
        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) 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()) {                
                    if (s[i] < b.s[i]) {
                        x += BASE;
                        g = -1;
                    }
                    x -= b.s[i];
                }
                c.s.push_back(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 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 (*this < b || b < *this); }
        bool operator == (const BigInteger& b) const { return (!(*this < b) && !(b < *this)); }
    };
    
    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;
    }
    
    istream& operator >> (istream &in, BigInteger& x) {
        string s;
        if (!(in >> s)) return in;
        x = s;
        return in;
    }
    
    #include<set>
    #include<map>
    set<BigInteger> s;
    map<BigInteger, int> m;
    
    int main() {
        BigInteger y;
        BigInteger x = y;
        BigInteger z = 123;
    
        BigInteger a, b;
        cin >> a >> b;
        cout << a - b << "
    ";
        //cout << BigInteger::BASE << "
    ";
        return 0;
    }
    代码
  • 相关阅读:
    docker 安装mysql
    Java web项目搭建系列之二 Jetty下运行项目
    Java web项目搭建系列之一 Eclipse中新建Maven项目
    Maven 添加其他Maven组件配置问题
    C# 中定义扩展方法
    Oracle 函数
    【Webservice】2 counts of IllegalAnnotationExceptions Two classes have the same XML type name
    Linux精简版系统安装网络配置问题解决
    Rsync 故障排查整理
    Failed to set session cookie. Maybe you are using HTTP instead of HTTPS to access phpMyAdmin.
  • 原文地址:https://www.cnblogs.com/frankying/p/8544337.html
Copyright © 2011-2022 走看看