• 大整数类模板


    可能还有一些bug没调出来。

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <cstring>
    #include <bitset>
    using namespace std;
    #define reg register
    inline int abss(int x) {return x < 0 ? -x : x;}
    
    struct BigInteger {
        int siz, num[10005];
        inline void Esc() {
            while(siz != 1 and num[siz] == 0) siz--;
        }
        BigInteger() {
            siz = 0;
            memset(num, 0, sizeof num);
        }
        BigInteger(int x)
        {
            siz = 0;
            while(x)
            {
                num[++siz] = x % 10;
                x /= 10;
            }
        }
        friend bool lesst (BigInteger A, BigInteger B)
        {
            if (A.siz < B.siz) return 1;
            if (A.siz > B.siz) return 0;
            for (reg int i = A.siz ; i >= 1 ; i --)
            {
                if (A.num[i] > B.num[i]) return 0;
                else if (A.num[i] < B.num[i]) return 1;
            }
        }
          friend bool operator < (BigInteger A, BigInteger B)
        {
            if (A.siz < B.siz) return 1;
            if (A.siz > B.siz) return 0;
            for (reg int i = A.siz ; i >= 1 ; i --)
                if (A.num[i] < B.num[i]) return 1;
                else if (A.num[i] > B.num[i]) return 0;
            return 1;
        }
        friend BigInteger operator + (BigInteger A, BigInteger B) //高精 + 高精
        {
            BigInteger ans;
            int s = max(A.siz, B.siz);
            ans.siz = s;
            for (reg int i = 1 ; i <= s ; i ++) ans.num[i] = A.num[i] + B.num[i];
            for (reg int i = 1 ; i <= s ; i ++)
            {
                if (ans.num[i] >= 10)
                {
                    ans.num[i+1] += ans.num[i] / 10;
                    ans.num[i] %= 10;
                }
            }
            if(ans.num[s+1] != 0) ans.siz++;
            ans.Esc();
            return ans;
        }
        friend BigInteger operator - (BigInteger A, BigInteger B) //高精 - 高精
        {
            BigInteger ans;
            if (lesst(A, B))
            {
                int i = 1;
                while (i <= A.siz or i <= B.siz)
                {
                    if (B.num[i] < A.num[i]) B.num[i] += 10, B.num[i+1]--;
                    ans.num[i] = B.num[i] - A.num[i];
                    i++;
                }
                ans.siz = i;
                ans.Esc();
                ans.num[ans.siz] = -1 * ans.num[ans.siz];
            }
            else
            {
                int i = 1;
                while (i <= A.siz or i <= B.siz)
                {
                    if (A.num[i] < B.num[i]) A.num[i] += 10, A.num[i+1]--;
                    ans.num[i] = A.num[i] - B.num[i];
                    i++;
                }
                ans.Esc();
                ans.siz = i;
            }
            return ans;
        }
        friend BigInteger operator * (BigInteger A, int x) //高精 * int
        {
            BigInteger ans;
            ans.siz = A.siz;
            for (reg int i = 1 ; i <= A.siz ; i ++) ans.num[i] = A.num[i] * x;
            int s;
            for (reg int i = 1 ; i <= A.siz or ans.num[i] ; i ++)
            {
                ans.num[i+1] += ans.num[i] / 10;
                ans.num[i] %= 10;
                s = i;
            }
            ans.siz = ans.num[s] ? s : s - 1;
            return ans;
        }
        friend BigInteger operator / (BigInteger A, int x) //高精 / int
        {
            BigInteger ans;
            ans.siz = A.siz;
            int rest = 0;
            for (reg int i = A.siz ; i >= 1 ; i --)
            {
                rest = rest * 10 + A.num[i];
                ans.num[i] = rest / x;
                rest %= x;
            }
            while(ans.siz >= 2 and ans.num[ans.siz] == 0) ans.siz--;
            return ans;
        }
        friend ostream & operator << (ostream &os, BigInteger A)
        {
            A.Esc();
            for (reg int i = A.siz ; i >= 1 ; i --)
                os << A.num[i];
            return os;
        }
    }a, b;
    
    BigInteger change(string s)
    {
        BigInteger A;
        int len = s.length();
        A.siz = len;
        for (reg int i = len ; i >= 1 ; i --) A.num[i] = s[len-i] - '0';
        return A;
    }
    
    int main()
    {
        string sa, sb;
        cin >> sa >> sb;
        a = change(sa), b = change(sb);
        cout << a - b << endl;
        cout << a + b << endl;
        cout << a * 2 << endl;
        cout << b / 2 << endl;
        return 0;
    }
  • 相关阅读:
    09-JS的事件流的概念(重点)
    08-jQuery的位置信息
    07-小米导航案例
    python-selector模块
    python--day9--异步IO、数据库、队列、缓存
    python--select多路复用socket
    python--gevent高并发socket
    python--协程
    python--进程锁、进程池
    python--多进程
  • 原文地址:https://www.cnblogs.com/BriMon/p/9518705.html
Copyright © 2020-2023  润新知