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


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

    模板:包含大数加减乘除。大数与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;
    }

  • 相关阅读:
    MySQL配置文件
    Linux安装MySQL以及版本说明
    RabbitMQ之Routing(路由有选择的接收)
    RabbitMQ之Publish/Subscribe(发布/订阅)
    RabibitMQ之Work Queues
    RabbitMQ简单生产者消费者(一对一)发送消息
    Linux下安装RabbitMQ
    PyQt5+qtdesigner开发环境配置
    利用sql语句建立全国省市区三级数据库
    完整项目:网上图书商城(一、MySQL数据库设计)未完
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5199829.html
Copyright © 2020-2023  润新知