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;
    }
  • 相关阅读:
    软件测试的定义及分类总结
    Selenium下拉菜单(Select)的操作Selenium快速入门(五)
    Selenium框架切换Selenium快速入门(七)
    元素(WebElement)Selenium快速入门(三)
    Selenium窗口切换Selenium快速入门(六)
    Selenium简介与环境搭配Selenium快速入门(一)
    测试用例的几种常见设计方法
    driver.get()和driver.navigate().to()到底有什么不同?Selenium快速入门(四)
    元素定位Selenium快速入门(二)
    关于VS2010与SQL Server2008 R2的安装问题
  • 原文地址:https://www.cnblogs.com/cold-cold/p/9991068.html
Copyright © 2011-2022 走看看