1. 程式人生 > 實用技巧 >Luogu1932 A+B A-B A*B A/B A%B Problem

Luogu1932 A+B A-B A*B A/B A%B Problem

https://www.luogu.com.cn/problem/P1932

高精度集合

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define b kz.a
#define c kzkz.a
#define d kzzf.a
#define N 20005
using namespace std;
int n,o;
char orz[N];
long long kza;
struct BigNumber
{
    int a[N];
    bool operator < (const BigNumber kz) const 
    {
        if (a[0]!=b[0])
            return a[0]<b[0];
        for (int i=a[0];i>=1;i--)
            if (a[i]!=b[i])
                return a[i]<b[i];
        return false;
    }
    bool operator <= (const BigNumber kz) const 
    {
        if (a[0]!=b[0])
            return a[0]<b[0];
        for (int i=a[0];i>=1;i--)
            if (a[i]!=b[i])
                return a[i]<b[i];
        return true;
    }
    bool operator > (const BigNumber kz) const 
    {
        if (a[0]!=b[0])
            return a[0]>b[0];
        for (int i=a[0];i>=1;i--)
            if (a[i]!=b[i])
                return a[i]>b[i];
        return false;
    }
    bool operator >= (const BigNumber kz) const 
    {
        if (a[0]!=b[0])
            return a[0]>b[0];
        for (int i=a[0];i>=1;i--)
            if (a[i]!=b[i])
                return a[i]>b[i];
        return true;
    }
    bool operator == (const BigNumber kz) const 
    {
        if (a[0]!=b[0])
            return false;
        for (int i=a[0];i>=1;i--)
            if (a[i]!=b[i])
                return false;
        return true;
    }
    bool operator != (const BigNumber kz) const 
    {
        if (a[0]!=b[0])
            return true;
        for (int i=a[0];i>=1;i--)
            if (a[i]!=b[i])
                return true;
        return false;
    }
    BigNumber operator + (BigNumber kz)
    {
        int ws=max(a[0],b[0]);
        int jw=0;
        for (int i=1;i<=ws;i++)
        {
            b[i]=b[i]+a[i]+jw;
            jw=b[i]/10;
            b[i]%=10;
        }
        while (jw)
        {
            ws++;
            b[ws]=jw%10;
            jw/=10;
        }
        b[0]=ws;
        return kz;
    }
    BigNumber operator - (BigNumber kz)
    {
        BigNumber kzkz;
        memcpy(c,a,(a[0]+1) << 2);
        int ws=max(c[0],b[0]);
        for (int i=1;i<=ws;i++)
        {
            if (i>b[0])
                b[i]=c[i]; else
                b[i]=c[i]-b[i];
            if (b[i]<0)
            {
                b[i]+=10;
                c[i+1]--;
            }
        }
        while (!b[ws] && ws>1)
            ws--;
        b[0]=ws;
        return kz;
    }
    BigNumber operator * (BigNumber kz)
    {
        int la=a[0],lb=b[0];
        BigNumber kzkz;
        for (int i=0;i<=la+lb;i++)
            c[i]=0;
        for (int i=1;i<=la;i++)
            for (int j=1;j<=lb;j++)
            {
                c[i+j-1]+=a[i]*b[j];
                c[i+j]+=c[i+j-1]/10;
                c[i+j-1]%=10;
            }
        if (c[la+lb])
            c[0]=la+lb; else
            c[0]=la+lb-1;
        return kzkz;
    }
    BigNumber operator / (BigNumber kz)
    {
        BigNumber kzkz,kzzf;
        for (int i=0;i<=a[0];i++)
            c[i]=d[i]=0;
        d[0]=1;
        for (int i=a[0];i>=1;i--)
        {
            if (!(d[0]==1 && d[1]==0))
            {
                for (int i=d[0];i>=1;i--)
                    d[i+1]=d[i];
                d[1]=a[i];
                d[0]++;
            } else
                d[1]=a[i];
            while (kzzf>=kz)
            {
                kzzf=kzzf-kz;
                c[i]++;
            }
        }
        c[0]=a[0];
        while (!c[c[0]] && c[0]>1)
            c[0]--;
        return kzkz;
    }
    BigNumber operator % (BigNumber kz)
    {
        BigNumber kzzf;
        for (int i=0;i<=a[0];i++)
            d[i]=0;
        d[0]=1;
        for (int i=a[0];i>=1;i--)
        {
            if (!(d[0]==1 && d[1]==0))
            {
                for (int i=d[0];i>=1;i--)
                    d[i+1]=d[i];
                d[1]=a[i];
                d[0]++;
            } else
                d[1]=a[i];
            while (kzzf>=kz)
                kzzf=kzzf-kz;
        }
        return kzzf;
    }
    void set0()
    {
        a[0]=1,a[1]=0;
    }
    void set1()
    {
        a[0]=1,a[1]=1;
    }
    void setINF()
    {
        a[0]=300,a[300]=9;
    }
    void read()
    {
        scanf("%s",orz);
        a[0]=strlen(orz);
        for (int i=0;i<a[0];i++)
            a[a[0]-i]=orz[i]-'0';
    }
}s,t,zero;
void operator += (BigNumber &kz,BigNumber &hz)
{
    kz=kz+hz;
}
void operator -= (BigNumber &kz,BigNumber &hz)
{
    kz=kz-hz;
}
void operator *= (BigNumber &kz,BigNumber &hz)
{
    kz=kz*hz;
}
void operator /= (BigNumber &kz,BigNumber &hz)
{
    kz=kz/hz;
}
void operator %= (BigNumber &kz,BigNumber &hz)
{
    kz=kz%hz;
}
BigNumber Number_Turn_BigNumber(long long x)
{
    BigNumber kz;
    b[0]=0;
    while (x)
    {
        b[++b[0]]=x%10;
        x/=10;
    }
    return kz;
}
long long BigNumber_Turn_Number(BigNumber kz)
{
    long long y=0;
    for (int i=b[0];i>=1;i--)
        y=y*10+b[i];
    return y;
}
BigNumber gcd(BigNumber x,BigNumber y)
{
    BigNumber r;
    while (y!=zero)
    {
        r=x;
        x=y;
        y=r%y;
    }
    return x;
}
BigNumber lcm(BigNumber x,BigNumber y)
{
    BigNumber r=gcd(x,y);
    return x/r*y;
}
#define max(x,y) ((x>y)?x:y)
#define min(x,y) ((x<y)?x:y)
void write(BigNumber kz)
{
    for (int i=b[0];i>=1;i--)
        putchar(b[i]+'0');
    putchar('\n');
}
int main()
{
    zero.set0();
    s.read(),t.read();
    write(s+t);
    if (s>=t)
        write(s-t); else
        putchar('-'),write(t-s);
    write(s*t);
    write(s/t);
    write(s%t);
    return 0;
}