高精度运算(压位)

单精加过程:

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;
}

猜你喜欢

转载自www.cnblogs.com/cold-cold/p/9991068.html