洛谷【2142】高精度减法

题目传送门: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;
}

猜你喜欢

转载自www.cnblogs.com/AKMer/p/9723013.html
今日推荐