1. 程式人生 > >洛谷【P2005】A/B Problem II

洛谷【P2005】A/B Problem II

.html pan emc .com void const strlen uri ring

題目傳送門:https://www.luogu.org/problemnew/show/P2005

高精除低精:https://www.cnblogs.com/AKMer/p/9724556.html

高精度除法板子。和高精除低精不同的是,除數不能直接去和當前位相除,而是能減一次算一次……

時間復雜度:\(O(len)\)

空間復雜度:\(O(len)\)

代碼如下:

#include <cstdio>
#include <cstring>
using namespace std;

const int maxn=25005;

char s[maxn];

struct Bignum {
    int num[maxn];

    void make() {
        num[0]=strlen(s+1);
        for(int i=1;i<=num[0];i++)
            num[i]=s[num[0]-i+1]-'0';
    }

    void print() {
        for(int i=num[0];i;i--)
            printf("%d",num[i]);
    }

    bool operator>=(const Bignum &a)const {
        if(num[0]!=a.num[0])return num[0]>a.num[0];
        for(int i=num[0];i;i--)
            if(num[i]!=a.num[i])return num[i]>a.num[i];
        return 1;
    }//比較

    Bignum operator-(const Bignum &a)const {
        Bignum c;memcpy(c.num,num,sizeof(c.num));
        for(int i=1;i<=c.num[0];i++) {
            if(c.num[i]<a.num[i])c.num[i+1]--,c.num[i]+=10;
            c.num[i]-=a.num[i];
        }
        while(!c.num[c.num[0]]&&c.num[0]>1)c.num[0]--;
        return c;
    }//高精度減法
}a,b,c;



void cpy(Bignum &a,int id,Bignum fake) {
    for(int i=1;i<=fake.num[0];i++)
        a.num[id+i-1]=fake.num[i];
    a.num[0]=fake.num[0]+id-1;
}//把fake丟到a裏,並且以id位開始,1到id-1都是0

Bignum operator/(Bignum a,Bignum b) {
    Bignum c;memset(c.num,0,sizeof(c.num));
    c.num[0]=a.num[0]-b.num[0]+1;
    for(int i=c.num[0];i;i--) {
        Bignum tmp;memset(tmp.num,0,sizeof(tmp.num));
        cpy(tmp,i,b);while(a>=tmp)c.num[i]++,a=a-tmp;//能減就減
    }while(c.num[0]>1&&!c.num[c.num[0]])c.num[0]--;
    return c;
}

int main() {
    scanf("%s",s+1);a.make();
    scanf("%s",s+1);b.make();
    c=a/b;c.print();
    return 0;
}

洛谷【P2005】A/B Problem II