高精度模板

高精度模板

#include<bits/stdc++.h>
using namespace std;
class Bigint
{
    public :
        int fig[7010],len;
        void decr() { while(len > 1 and (not fig[len-1])) len--; }
        Bigint() { memset(fig,0,sizeof(fig)); len = 1;}
        Bigint(int num) { *this = num; }
        Bigint(char *num) { *this = num; }
        Bigint operator = (const char* num)
        {
            memset(fig,0,sizeof(fig));
            len = strlen(num);
            for(int i = 0;i < len;i++) fig[i] = num[len-i-1] - '0';
            decr();
            return *this;
        }
        Bigint operator = (int num)
        {
            char s[7010];
            sprintf(s,"%d",num);
            return *this = s;
        }
        Bigint operator + (Bigint b)
        {
            Bigint a = *this; int i;
            for(i = 0;i < b.len;i++)
            {
                a.fig[i] += b.fig[i];
                if(a.fig[i] > 9) a.fig[i] %= 10,a.fig[i+1]++;
            }
            while(a.fig[i] > 9) a.fig[i++] %= 10,a.fig[i]++;
            a.len = max(len,b.len);
            if(a.fig[i] and a.len <= i) a.len = i + 1;
            return a;
        }
        Bigint operator - (Bigint b)
        {
            Bigint a = *this; int i;
            for(i = 0;i < b.len;i++)
            {
                a.fig[i] -= b.fig[i];
                if(a.fig[i] < 0) a.fig[i] += 10,a.fig[i+1]--;
            }
            while(a.fig[i] < 0) a.fig[i++] += 10,a.fig[i]--;
            a.decr();
            return a;
        }
        Bigint operator * (Bigint b)
        {
            Bigint a;
            a.len = len + b.len;
            for(int j = 0;j < b.len;j++)
                for(int i = 0;i < len;i++)
                    a.fig[i+j] += fig[i] * b.fig[j];
            for(int i = 0;i < a.len - 1;i++)
                a.fig[i+1] += a.fig[i] / 10,a.fig[i] %= 10;
            a.decr();
            return a;
        }
        Bigint operator / (Bigint b)
        {
            Bigint c = *this,a = 0;
            for(int i = len - 1;i >= 0;i--)
            {
                a = a * 10 + fig[i];
                for(int j = 0;j < 10;j++)
                {
                    if(a < b * (j + 1))
                    {
                        c.fig[i] = j;
                        a = a - b * j;
                        break;
                    }
                }
            }
            c.decr();
            return c;
        }
        Bigint operator % (Bigint b)
        {
            Bigint a = 0;
            for(int i = len - 1;i >= 0;i--)
            {
                a = a * 10 + fig[i];
                for(int j = 0;j < 10;j++)
                if(a < b * (j + 1))
                {
                    a = a - b * j;
                    break;
                }
            }
            return a;
        }
        Bigint operator += (Bigint b)
        {
            *this = *this + b;
            return *this;
        }
        bool operator < (Bigint b)
        {
            if(len != b.len) return len < b.len;
            for(int i = len - 1;i >= 0;i--)
                if(b.fig[i] != fig[i]) return fig[i] < b.fig[i];
            return false;
        }
        bool operator > (Bigint b){ return b < *this; }
        bool operator <= (Bigint b){ return (not (b < *this)); }
        bool operator >= (Bigint b){ return (not(*this < b)); }
        bool operator != (Bigint b){ return (b < *this) or (*this < b); }
        bool operator == (Bigint b){ return (not (b < *this)) and (not(*this < b)); }
        string str() const 
        {
            char s[7010] = {};
            for(int i = 0;i < len;i++) s[len-i-1] = fig[i] + '0';
            return s;
        }
};
istream& operator >> (istream& in,Bigint& x)
{
    string s;
    in >> s;
    x = s.c_str();
    return in;
}
ostream& operator << (ostream& out,Bigint& x)
{
    out << x.str();
    return out;
}
Bigint a,b,ans;
signed main()
{
    cin >> a >> b;
    ans = a / b;
    cout << ans << endl;
    return 0;
}
View Code

 

posted @ 2021-11-09 11:29  一程山雪  阅读(26)  评论(0)    收藏  举报