zoukankan      html  css  js  c++  java
  • 洛谷【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;
    }
    
  • 相关阅读:
    团队博客(21)
    团队博客(20)
    站立会议报告(14)
    站立会议报告(13)
    软件工程(2018)第二次团队作业
    团队作业(一)
    结对第二次作业
    结对编程第一次作业
    软件工程第三次个人作业
    第二次作业软件工程
  • 原文地址:https://www.cnblogs.com/AKMer/p/9723013.html
Copyright © 2011-2022 走看看