题目传送门: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;
}
原文:https://www.cnblogs.com/AKMer/p/9723013.html