zoukankan      html  css  js  c++  java
  • 高精度运算(压位)

    单精加过程:

    void add_dan(ll *a,ll num,ll len1,ll &len)
    {
        a[1]+=num;len=1;
        while(a[len+1]>=ya)
        {
            ++len;
            a[len+1]+=a[len]/ya;
            a[len]=a[len]%ya;
        }
        len=max(len,len1);
    }

    高精加过程:

    void add_gao(ll *a,ll *b,ll len1,ll len2,ll &len)
    {
        len=max(len1,len2);
        for(int i=1;i<=len;i++)
        {
            a[i]+=b[i];
            if(a[i]>=ya)
            {
                a[i+1]+=a[i]/ya;
                a[i]=a[i]%ya;
            }
        }
        while(a[len+1])
        {
            ++len;
            if(a[len]>=ya)
            {
                a[len+1]+=a[len]/ya;
                a[len]=a[len]%ya;
            }
        }
    }

    高精减过程:

    void jian_gao(ll *a,ll *b,ll len1,ll len2,ll &len)
    {
        len=max(len1,len2);
        for(int i=1;i<=len;i++)
        {
            a[i]-=b[i];
            if(a[i]<0)
            {
                a[i+1]--;
                a[i]+=ya;
            }
        }
        ++len;
        while(!a[len-1]) --len;
        --len;
    }

    单精乘过程:

    void mul_dan(ll *a,ll num,ll len1,ll &len)
    {
        ll temp=0;
        len=len1;
        for(int i=1;i<=len1;i++)
        {
            a[i]=temp+a[i]*num;
            if(a[i]>=ya)
            {
                temp=a[i]/ya;
                a[i]%=ya;
            }
            else temp=0;
        }
        if(temp) a[++len]=temp;
        while(a[len+1])
        {
            ++len;
            if(a[len]>=ya)
            {
                a[len+1]+=a[len]/ya;
                a[len]=a[len]%ya;
            }
        }
    }

    高精乘过程:

    void mul_gao(ll *a,ll *b,ll *c,ll len1,ll len2,ll &len)
    {
        len=len1+len2-1;
        for(int i=1;i<=len1;i++)
            for(int j=1;j<=len2;j++)
            {
                c[i+j-1]+=a[i]*b[j];
                if(c[i+j-1]>=ya)
                {
                    c[i+j]+=c[i+j-1]/ya;
                    c[i+j-1]%=ya;
                }
            }
        while(c[len+1])
        {
            ++len;
            if(c[len]>=ya)
            {
                c[len+1]+=c[len]/ya;
                c[len]=c[len]%ya;
            }
        }
    }

    单精除过程:

    void div_dan(ll *a,ll *c,ll num,ll len1,ll &len)
    {
        ll temp=0;
        for(int i=len1;i>=1;i--)
        {
            c[i]=(temp*ya+a[i])/num;
            temp=(temp*ya+a[i])%num;
        }
        ++len;
        while(!a[len-1]) --len;
        --len;
    }

    输出:

    void pri(ll *a,ll len)
    {
        printf("%lld",a[max(1ll,len)]);
        for(int i=max(1ll,len)-1;i>=1;i--)
            printf("%08lld",a[i]);
        puts("");
    }

    总代码如下:

    #include <cstdlib>
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <cstdio>
    using namespace std;
    typedef long long ll;
    inline int read()
    {
        int a=0,p=0;char ch=getchar();
        while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
        if(ch=='-') p=1,ch=getchar();
        while(ch>='0'&&ch<='9') a=(a<<3)+(a<<1)+ch-'0',ch=getchar();
        return p?-a:a;
    }
    const int N=1000010;
    const ll ya=100000000;
    char t1[N],t2[N];
    ll a[N],b[N],c[N],len1,len2,len;
    
    //----------------------***   +   ***---------------------//
    void add_gao(ll *a,ll *b,ll len1,ll len2,ll &len)
    {
        len=max(len1,len2);
        for(int i=1;i<=len;i++)
        {
            a[i]+=b[i];
            if(a[i]>=ya)
            {
                a[i+1]+=a[i]/ya;
                a[i]=a[i]%ya;
            }
        }
        while(a[len+1])
        {
            ++len;
            if(a[len]>=ya)
            {
                a[len+1]+=a[len]/ya;
                a[len]=a[len]%ya;
            }
        }
    }
    
    void add_dan(ll *a,ll num,ll len1,ll &len)
    {
        a[1]+=num;len=1;
        while(a[len+1]>=ya)
        {
            ++len;
            a[len+1]+=a[len]/ya;
            a[len]=a[len]%ya;
        }
        len=max(len,len1);
    }
    //----------------------***   +   ***---------------------//
    
    //----------------------***   -   ***---------------------//
    void jian_gao(ll *a,ll *b,ll len1,ll len2,ll &len)
    {
        len=max(len1,len2);
        for(int i=1;i<=len;i++)
        {
            a[i]-=b[i];
            if(a[i]<0)
            {
                a[i+1]--;
                a[i]+=ya;
            }
        }
        ++len;
        while(!a[len-1]) --len;
        --len;
    }
    //----------------------***   -   ***---------------------//
    
    //----------------------***   *   ***---------------------//
    void mul_gao(ll *a,ll *b,ll *c,ll len1,ll len2,ll &len)
    {
        len=len1+len2-1;
        for(int i=1;i<=len1;i++)
            for(int j=1;j<=len2;j++)
            {
                c[i+j-1]+=a[i]*b[j];
                if(c[i+j-1]>=ya)
                {
                    c[i+j]+=c[i+j-1]/ya;
                    c[i+j-1]%=ya;
                }
            }
        while(c[len+1])
        {
            ++len;
            if(c[len]>=ya)
            {
                c[len+1]+=c[len]/ya;
                c[len]=c[len]%ya;
            }
        }
    }
    
    void mul_dan(ll *a,ll num,ll len1,ll &len)
    {
        ll temp=0;
        len=len1;
        for(int i=1;i<=len1;i++)
        {
            a[i]=temp+a[i]*num;
            if(a[i]>=ya)
            {
                temp=a[i]/ya;
                a[i]%=ya;
            }
            else temp=0;
        }
        if(temp) a[++len]=temp;
        while(a[len+1])
        {
            ++len;
            if(a[len]>=ya)
            {
                a[len+1]+=a[len]/ya;
                a[len]=a[len]%ya;
            }
        }
    }
    //----------------------***   *   ***---------------------//
    
    //----------------------***   /   ***---------------------//
    void div_dan(ll *a,ll *c,ll num,ll len1,ll &len)
    {
        ll temp=0;
        for(int i=len1;i>=1;i--)
        {
            c[i]=(temp*ya+a[i])/num;
            temp=(temp*ya+a[i])%num;
        }
        ++len;
        while(!a[len-1]) --len;
        --len;
    }
    //----------------------***   /   ***---------------------//
    
    //----------------------***   P   ***---------------------//
    void pri(ll *a,ll len)
    {
        printf("%lld",a[max(1ll,len)]);
        for(int i=max(1ll,len)-1;i>=1;i--)
            printf("%08lld",a[i]);
        puts("");
    }
    //----------------------***   P   ***---------------------//
    int main()
    {
        // freopen(".in","r",stdin);
        // freopen(".out","w",stdout);
        scanf("%s",t1);scanf("%s",t2);
        len1=strlen(t1);len2=strlen(t2);
        ll cnt=0;
        for(int i=len1-1;i>=0;i-=8)
        {
            ++cnt;
            if(i<8)
            {
                for(int j=0;j<=i;j++) 
                    a[cnt]=a[cnt]*10+t1[j]-'0';
                break;
            }
            for(int j=i-7;j<=i;j++) 
                a[cnt]=a[cnt]*10+t1[j]-'0';
        }
        len1=cnt;cnt=0;
        for(int i=len2-1;i>=0;i-=8)
        {
            ++cnt;
            if(i<8)
            {
                for(int j=0;j<=i;j++) 
                    b[cnt]=b[cnt]*10+t2[j]-'0';
                break;
            }
            for(int j=i-7;j<=i;j++) 
                b[cnt]=b[cnt]*10+t2[j]-'0';
        }
        len2=cnt;
        // a+b
        // add_gao(a,b,len1,len2,len);
        // pri(a,len);
    
        // a-b
        // jian_gao(a,b,len1,len2,len);
        // pri(a,len);
    
        // a*b
        // mul_gao(a,b,len1,len2,len);
        // pri(a,len);
    
        // a*b
        // mul_dan(a,num,len1,len);
        // pri(a,len);
    
        // a/b
        // div_dan(a,c,num,len1,len);
        // pri(c,len);
        return 0;
    }
  • 相关阅读:
    Codeforces Round #325D (Div. 2) (DP)
    Codeforces Round #382 (Div. 2) (模拟|数学)
    HDU5950-Recursive sequence(矩阵快速幂)
    9. javacript高级程序设计-客户端检测
    8. javacript高级程序设计-BOM
    7. javacript高级程序设计- 函数表达式
    6. javacript高级程序设计-面向对象设计
    Js注释
    5. javacript高级程序设计-引用类型
    4. javacript高级程序设计-变量、作用域和内存问题
  • 原文地址:https://www.cnblogs.com/cold-cold/p/9991068.html
Copyright © 2011-2022 走看看