高精度板子

#pragma GCC optimize("O2")
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<bitset>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<stack>
#include<set>
#include<map>
#include<limits.h>
#include<ctime>
#define N 100001
typedef long long ll;
const int inf=0x3fffffff;
const int maxn=2017;
const int mod=1000000007;
using namespace std;
inline int read()
{
    int f=1,x=0;char ch=getchar();
    while(ch>'9'||ch<'0')
    {
        if(ch=='-')
        f=-1;
        ch=getchar();
    }
    while(ch<='9'&&ch>='0')
    {
        x=(x<<3)+(x<<1)+ch-'0';
        ch=getchar();
    }
    return f*x;
}
struct bnum
{
    short a[N];
    int size;
    bnum()
    {
        memset(a,0,sizeof a);
        size=1;
    }
    bnum(ll k)
    {
        *this=k;
    }
    bnum operator =(ll k)
    {
        char ch[1000];
        sprintf(ch,"%lld",k);
        size=strlen(ch);
        for(int i=0;i<size;i++)
        a[i]=ch[size-i-1]-'0';
        return *this;
    }
    bool operator <(bnum b)
    {
        if(size==b.size)
        {
            for(int i=size-1;i>=0;i--)
            {
                if(a[i]<b.a[i])return 1;
                if(a[i]>b.a[i])return 0;
            }
            return 0;
        }
        else return size<b.size;
    }
    bool operator >=(bnum b)
    {
        return !(*this<b);
    }
    bool operator >(bnum b)
    {
        return b<*this;
    }
    bool operator ==(bnum b)
    {
        return (!(*this<b)&&(!(b<*this)));
    }
    bnum operator +(bnum b)
    {
        bnum c;
        int lena=size,lenb=b.size;
        c.size=max(lena,lenb)+1;
        for(int i=0;i<c.size+1;i++)
        {
            c.a[i]+=a[i]+b.a[i];
            if(c.a[i]>=10)
            c.a[i]-=10,c.a[i+1]++;
        }
        if(!c.a[c.size-1]&&c.size>1)
        c.size--;
        return c;
    }
    bnum operator -(bnum b)
    {
        bnum c;
        int lena=size,lenb=b.size;
        c.size=max(lena,lenb);
        for(int i=0;i<c.size;i++)
        {
            c.a[i]+=a[i]-b.a[i];
            if(c.a[i]<0)
            c.a[i]+=10,c.a[i+1]--;
        }
        while(!c.a[c.size-1]&&c.size>1)c.size--;
        return c;
    }
    bnum operator /(bnum b)
    {
        bnum c,d,q=*this;
        c.size=size-b.size+1;
        for(int i=c.size-1;i>=0;i--)
        {
            d.clear();
            d=b.numcpy(i+1);
            while(q>=d)
            {c.a[i]++;q=q-d;}
        }
        while(!c.a[c.size-1]&&c.size>0)c.size--;
        return c;
    }
    bnum operator %(bnum b)
    {
        bnum c,d,q=*this;
        c.size=size-b.size+1;
        for(int i=c.size-1;i>=0;i--)
        {
            d.clear();
            d=b.numcpy(i+1);
            while(q>=d)
            {c.a[i]++;q=q-d;}
        }
        return q;
    }
private:
    void clear()
    {
        memset(a,0,sizeof a);
        size=1;
    }
    bnum numcpy(int k)
    {
        bnum c;
        for(int i=0;i<size;i++)
        c.a[i+k-1]=a[i];
        c.size=size+k-1;
        return c;
    }
};
ostream& operator <<(ostream &os,bnum x)
{
    for(int i=x.size-1;i>=0;i--)
    printf("%d",x.a[i]);
    return os;
}
istream& operator >>(istream &is,bnum &x)
{
    char ch[N];
    scanf("%s",ch);
    x.size=strlen(ch);
    for(int i=0;i<x.size;i++)
    {
        x.a[i]=ch[x.size-i-1]-'0';
    }
    return is;
}
ll qpow(ll a,ll b)
{
    ll res=1;
    while(b)
    {
        if(b&1)
        res=res*a;
        a=a*a;
        b>>=1;
    }
    return res;
}
ll cpy(bnum b)
{
    ll res=0;
    for(int i=0;i<b.size;i++)
    res+=qpow(10,i)*b.a[i];
    return res;
}

 

posted @ 2017-11-02 15:02  a799091501  阅读(191)  评论(0编辑  收藏  举报