洛谷【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() {
		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)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[0]>1&&!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;
}
posted @ 2018-09-29 12:00  AKMer  阅读(156)  评论(0编辑  收藏  举报