高精度

下为高精度,自带+,-,*,/,%,>,<,>=,<=运算和3种输入和输出,但不支持负数

struct Num
{
    int len,num[N];
    void init()
    {
        len=0;
        memset(num,0,sizeof(num));
    }
    void add(int u)
    {
        int i;
        len++;
        for(i=len; i>=2; i--)
        {
            num[i]=num[i-1];
        }
        num[1]=u;
    }
    void in_int(int u)
    {
        len=0;
        for(;u;len++,num[len]=u%10,u/=10);
    }
    void in_string(string u)
    {
        int i;
        Num res;
        init();
        len=u.size();
        for(i=u.size()-1; i>=0; i--)
        {
            num[u.size()-i]=u[i]-48;
        }
    }
    void in()
    {
        char ch;
        int i;
        string str="";
        for(ch=getchar();ch<='0';ch=getchar());
        for(;ch>='0';ch=getchar(),str=ch+str);
        len=str.size();
        for(i=0;i<len;i++,num[i+1]=str[i]-1);
    }
    void out()
    {
        int i;
        for(i=len; i>=1; i--)
        {
            printf("%d",num[i]);
        }
        puts("");
    }
    bool operator < (const Num &u) const
    {
        if(len<u.len) return 1;
        if(len>u.len) return 0;
        int i;
        for(i=len; i>=1; i--)
        {
            if(num[i]<u.num[i]) return 1;
            if(num[i]>u.num[i]) return 0;
        }
        return 0;
    }
    bool operator > (const Num &u) const
    {
        if(len<u.len) return 0;
        if(len>u.len) return 1;
        int i;
        for(i=len; i>=1; i--)
        {
            if(num[i]<u.num[i]) return 0;
            if(num[i]>u.num[i]) return 1;
        }
        return 0;
    }
    bool operator == (const Num &u) const
    {
        if(len!=u.len) return 0;
        int i;
        for(i=len; i>=1; i--)
        {
            if(num[i]!=u.num[i]) return 0;
        }
        return 1;
    }
    bool operator >= (const Num & u) const
    {
        if(*this<u) return 0;
        return 1;
    }
    bool operator <= (const Num & u) const
    {
        if(*this>u) return 0;
        return 1;
    }
    Num operator + (const Num &u) const
    {
        Num res;
        int i;
        res.init();
        res.len=max(u.len,len);
        for(i=1; i<=res.len; i++)
        {
            res.num[i]+=u.num[i]+num[i];
            res.num[i+1]+=res.num[i]/10;
            res.num[i]%=10;
        }
        res.len+=res.num[res.len+1];
        return res;
    }
    Num operator - (const Num &u) const
    {
        Num res;
        int i;
        res.init();
        res.len=len;
        for(i=1; i<=len; i++)
        {
            res.num[i]+=num[i]-u.num[i];
            if(res.num[i]<0)
            {
                res.num[i]+=10;
                res.num[i+1]--;
            }
        }
        for(; !res.num[res.len]&&res.len>=2; res.len--);
        return res;
    }
    Num operator * (const Num &u) const
    {
        Num res;
        int i,j;
        res.init();
        for(i=1; i<=len; i++)
        {
            for(j=1; j<=u.len; j++)
            {
                res.num[i+j-1]+=num[i]*u.num[j];
            }
        }
        for(i=1; i<=len+u.len; i++)
        {
            res.num[i+1]+=res.num[i]/10;
            res.num[i]%=10;
        }
        res.len=len+u.len;
        for(; !res.num[res.len]&&res.len>=2; res.len--);
        return res;
    }
    Num operator / (const Num &u) const
    {
        Num res,last,tmp;
        res.init();
        last.init();
        int i,j,k,now;
        now=len;
        for(;;)
        {
            for(; last<u&&now;)
            {
                last.add(num[now]);
                res.add(0);
                now--;
            }
            if(!now&&last<u) break;
            for(i=2; i<=9; i++)
            {
                tmp.init();
                tmp.len=1;
                tmp.num[1]=i;
                tmp=tmp*u;
                if(tmp>last) break;
            }
            res.add(i-1);
            last=last+u-tmp;
            if(!now) break;
            last.add(num[now]);
            now--;
            for(; !last.num[last.len]&&last.len>=2; last.len--);
        }
        for(; !res.num[res.len]&&res.len>=2; res.len--);
        return res;
    }
    Num operator % (const Num &u) const
    {
        Num res,last,tmp;
        res.init();
        last.init();
        int i,j,k,now;
        now=len;
        for(;;)
        {
            for(; last<u&&now;)
            {
                last.add(num[now]);
                now--;
            }
            if(!now&&last<u) break;
            for(i=2; i<=9; i++)
            {
                tmp.init();
                tmp.len=1;
                tmp.num[1]=i;
                tmp=tmp*u;
                if(tmp>last) break;
            }
            last=last+u-tmp;
            if(!now) break;
            last.add(num[now]);
            now--;
            for(; !last.num[last.len]&&last.len>=2; last.len--);
        }
        for(; !last.num[last.len]&&last.len>=2; last.len--);
        return last;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值