1. 程式人生 > >洛谷【2142】高精度減法

洛谷【2142】高精度減法

set put 否則 max can 復雜 比較 uri gnu

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

高精度減法板子題,回憶一下小學列豎式打草稿的過程即可。

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

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

代碼如下:

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

const int maxn=10005;

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() {
        if(!num[0])puts("0");
        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 0;
    }

    Bignum operator-(const Bignum &a) {
        Bignum c;memset(c.num,0,sizeof(c.num));
        c.num[0]=max(num[0],a.num[0]);
        for(int i=1;i<=c.num[0];i++) {
            if(num[i]<a.num[i])num[i+1]--,num[i]+=10;//借位
            c.num[i]=num[i]-a.num[i];//減
        }
        while(c.num[0]&&!c.num[c.num[0]])c.num[0]--;//因為可能減掉很多位,所以是while
        return c;
    }
}a,b,c;

int main() {
    scanf("%s",s+1);a.make();;
    scanf("%s",s+1);b.make();
    if(a<b)printf("-"),swap(a,b);//因為可能會有a<b的情況,所以判一下就可以了
    c=a-b;c.print();//就很舒服
    return 0;
}

洛谷【2142】高精度減法