• 大数高精度运算(模板)


    前言:高精度运算。是指參与运算的数(加数。减数,因子……)范围大大超出了标准数据类型(整型,实型)能表示的范围的运算。

    模板:包含大数加减乘除。大数与int数的乘法,模板能够不断扩充。

    代码:

    /*
    所有亲測可用,可是不能用于负数的运算,仅仅能对正数进行大数运算
    */
    const int ten[4]= {1,10,100,1000};
    const int maxl = 300;
    struct BigNumber
    {
        int d[maxl];
        char s[maxl];
        BigNumber(const char s[])
        {
            int len=strlen(s);
            d[0]=(len-1)/4+1;
            int i,j,k;
            for(int i=1; i<maxl; i++)
                d[i]=0;
            for(int i=len-1; i>=0; i--)
            {
                j=(len-i-1)/4+1;
                k=(len-i-1)%4;
                d[j]+=ten[k]*(s[i]-'0');
            }
            while(d[0]>1&&d[d[0]]==0)
                d[0]--;
        }
        BigNumber()
        {
            *this=BigNumber("0");
        }
        BigNumber(int x)
        {
            for (int i=0; i<maxl; i++) d[i]=0;
            if (!x) d[0]=1;
            while(x)
            {
                d[++d[0]]=x%10000;
                x/=10000;
            }
        }
        BigNumber(long long x)
        {
            for (int i=0; i<maxl; i++) d[i]=0;
            if (!x) d[0]=1;
            while(x)
            {
                d[++d[0]]=x%10000;
                x/=10000;
            }
        }
        void print()
        {
            int len=d[0];
            printf("%d",d[d[0]]);
            for(int i=len-1; i>=1; i--)
            {
                if(d[i]>=1000)
                    printf("%d",d[i]);
                else if(d[i]>=100)
                    printf("0%d",d[i]);
                else if(d[i]>=10)
                    printf("00%d",d[i]);
                else printf("000%d",d[i]);
            }
    
            printf("
    ");
        }
        void toString()
        {
            int top=0;
            int i,j,temp;
            for(i=3; i>=1; i--)
                if(d[d[0]]>=ten[i])
                    break;
            temp=d[d[0]];
            for(j=i; j>=0; j--)
            {
                s[top++]=(char)(temp/ten[j]+'0');
                temp%=ten[j];
            }
            for(i=d[0]-1; i>0; i--)
            {
                temp=d[i];
                for(j=3; j>=0; j--)
                {
                    s[top++]=(char)(temp/ten[j]+'0');
                    temp%=ten[j];
                }
            }
        }
    } zero=BigNumber(),d,temp,mid1[15],a[3005];
    bool operator < (const BigNumber &a,const BigNumber &b)
    {
        if(a.d[0]!=b.d[0])
            return a.d[0]<b.d[0];
        int i;
        for(i=a.d[0]; i>0; i--)
            if(a.d[i]!=b.d[i])
                return a.d[i]<b.d[i];
        return false;
    }
    bool operator > (const BigNumber &a,const BigNumber &b)
    {
        if(b.d[0]!=a.d[0])
            return b.d[0]<a.d[0];
        int i;
        for(i=b.d[0]; i>0; i--)
            if(a.d[i]!=b.d[i])
                return b.d[i]<a.d[i];
        return false;
    }
    bool operator ==(const BigNumber &a,const BigNumber &b)
    {
        int i;
        if(a.d[0]!=b.d[0])
            return false;
        for(i=1; i<=a.d[0]; i++)
            if(a.d[i]!=b.d[i])
                return false;
        return true;
    }
    bool operator <= (const BigNumber &a,const BigNumber &b)
    {
        return a<b||a==b;
    }
    bool operator >= (const BigNumber &a,const BigNumber &b)
    {
        return a>b||a==b;
    }
    BigNumber operator +(const BigNumber &a,const BigNumber &b)
    {
        BigNumber c;
        c.d[0]=max(a.d[0],b.d[0]);
        int i,x=0;
        for(i=1; i<=c.d[0]; i++)
        {
            x=a.d[i]+b.d[i]+x;
            c.d[i]=x%10000;
            x/=10000;
        }
        while(x!=0)
        {
            c.d[++c.d[0]]=x%10000;
            x/=10000;
        }
        return c;
    }
    BigNumber operator -(const BigNumber &a,const BigNumber &b)
    {
        BigNumber c;
        c.d[0]=a.d[0];
        int i,x=0;
        for(i=1; i<=c.d[0]; i++)
        {
            x=10000+a.d[i]-b.d[i]+x;
            c.d[i]=x%10000;
            x=x/10000-1;
        }
        while((c.d[0]>1)&&(c.d[c.d[0]]==0))
            c.d[0]--;
        return c;
    }
    BigNumber operator *(const BigNumber &a,const BigNumber &b)
    {
        BigNumber c;
        c.d[0]=a.d[0]+b.d[0];
        int i,j,x;
        for(i=1; i<=a.d[0]; i++)
        {
            x=0;
            for(int j=1; j<=b.d[0]; j++)
            {
                x=a.d[i]*b.d[j]+x+c.d[i+j-1];
                c.d[i+j-1]=x%10000;
                x/=10000;
            }
            c.d[i+b.d[0]]=x;
        }
        while((c.d[0]>1)&&(c.d[c.d[0]]==0))
            --c.d[0];
        return c;
    }
    bool smaller(const BigNumber &a,const BigNumber &b,int delta)
    {
        if(a.d[0]+delta!=b.d[0])
            return a.d[0]+delta<b.d[0];
        int i;
        for(i=a.d[0]; i>0; i--)
            if(a.d[i]!=b.d[i+delta])
                return a.d[i]<b.d[i+delta];
        return true;
    }
    void Minus (BigNumber &a,const BigNumber &b,int delta)
    {
        int i,x=0;
        for(i=1; i<=a.d[0]-delta; i++)
        {
            x=10000+a.d[i+delta]-b.d[i]+x;
            a.d[i+delta]=x%10000;
            x=x/10000-1;
        }
        while((a.d[0]>1)&&(a.d[a.d[0]]==0))
            a.d[0]--;
    }
    BigNumber operator *(const BigNumber &a,const int &k)
    {
        BigNumber c;
        c.d[0]=a.d[0];
        int i,x=0;
        for(i=1; i<=a.d[0]; i++)
        {
            x=a.d[i]*k+x;
            c.d[i]=x%10000;
            x/=10000;
        }
        while(x>0)
        {
            c.d[++c.d[0]]=x%10000;
            x/=10000;
        }
        while((c.d[0]>1)&&(c.d[c.d[0]]==0))
            c.d[0]--;
        return c;
    }
    BigNumber operator /(const BigNumber &a,const BigNumber &b)
    {
        BigNumber c;
        d=a;
        int i,j,temp;
        mid1[0]=b;
        for(int i=1; i<=13; i++)
            mid1[i]=mid1[i-1]*2;
        for(i=a.d[0]-b.d[0]; i>=0; i--)
        {
            temp=8192;
            for(j=13; j>=0; j--)
            {
                if(smaller(mid1[j],d,i))
                {
                    Minus(d,mid1[j],i);
                    c.d[i+1]+=temp;
                }
                temp/=2;
            }
        }
        c.d[0]=max(1,a.d[0]-b.d[0]+1);
        while((c.d[0]>1)&&(c.d[c.d[0]]==0))
            c.d[0]--;
        return c;
    }
    BigNumber operator %(const BigNumber &a,const BigNumber &b)
    {
        BigNumber c=a/b;
        return a-b*c;
    }

  • 相关阅读:
    微信“为盲胞读书”项目上线“团体领读”新功能
    神秘代码让iPhone微信闪退的解决方法
    [腾讯首季业绩数据]微信支付用户数持续上升
    [民间调查]小学生微信使用情况的调查 90%小学高年级学生用微信
    O2O模式成功案例分享 汲取精华化为己用
    太原警方通过微博提醒您手机丢失如何保微信安全
    百度富媒体展示允许自定义站点Logo/简介等
    网页出现scanstyles does nothing in Webkit / Mozilla的解决方法
    安卓微信新版内测 可分享小视频/可设微信字体大小
    微信电脑版微信1.1 for Windows更新 可@人/转发撤回消息/可播小视频
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5199829.html
Copyright © 2020-2023  润新知