侧边栏壁纸
  • 累计撰写 192 篇文章
  • 累计创建 2 个标签
  • 累计收到 87 条评论

【题解】高精度减法3

Allen Best
2024-01-06 / 0 评论 / 3 点赞 / 1,280 阅读 / 1,593 字
温馨提示:
本文最后更新于 2024-01-20,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
四种情况

image.png
测试样例1:
123456789
-11111111111111111111111111111
输出:
11111111111111111111234567900

测试样例:
-1321323123123123123124123123123
-9999999999999999999999999999999999999999
输出:
9999999998678676876876876876875876876876

#include<bits/stdc++.h>
using namespace std;
string s1,s2;
//1、定义3个int 型数组
int a[1000],b[1000],c[1000]; 
//1.1 比较两个数大小
bool cmp(string s1,string s2){
	if(s1.size()<s2.size()){
		return false;
	}
	if(s1.size()==s2.size())
		return s1>=s2;
	return true;
} 
bool add(string s1,string s2){
	int la,lb,lc;
    la=s1.size();//s1.length()
    lb=s2.size();//s2.length()
    for(int i=0;i<la;i++){
    	a[la-i]=s1[i]-'0';//将字符转换为数字,并且将字符倒序转置便于计算 
	}
	for(int i=0;i<lb;i++){
		b[lb-i]=s2[i]-'0';
	}
	lc=max(la,lb)+1;
	for(int i=1;i<=lc;i++){
		c[i]+=a[i]+b[i];
		c[i+1]=c[i]/10;
		c[i]=c[i]%10;
	}
	if(c[lc]==0 && lc>0){//删除前导0 
		lc--;
	}
	for(int i=lc;i>0;i--){
		cout<<c[i];
	}
}
bool sub(string s1,string s2){
	int lena,lenb,lenc=0,f=0;
	if(!cmp(s1,s2)){
		swap(s1,s2);
		f=1;
	}
	lena=s1.size();
	lenb=s2.size();
	//2、倒序存储
	for(int i=0;i<lena;i++){
		a[i]=s1[lena-1-i]-'0';
	} 
	for(int i=0;i<lenb;i++){
		b[i]=s2[lenb-1-i]-'0';
	} 
	//3、按位相减 
	lenc=max(lena,lenb);
	for(int i=0;i<lenc;i++){
		if(a[i]<b[i]){
			a[i]+=10;
			a[i+1]-=1;
		}
		c[i]=a[i]-b[i];
	}
	while(c[lenc]==0&&lenc>0){
		lenc--;
	}
	if(f==1)cout<<"-";
	//4、倒序输出结果
	for(int i=lenc;i>=0;i--){
		cout<<c[i];
	} 
}
int main(){
	cin>>s1>>s2;
	if(s1[0]!='-'&&s2[0]!='-'){
		sub(s1,s2);
	}else if(s1[0]=='-'&&s2[0]=='-'){
		s1.erase(0,1);
		s2.erase(0,1);
		sub(s2,s1);
	}else if(s1[0]=='-'&&s2[0]!='-'){
		s1.erase(0,1);
		cout<<"-";
		add(s1,s2);
	}else if(s1[0]!='-'&&s2[0]=='-'){
		s2.erase(0,1);
		add(s1,s2);
	}
	return 0;
}

0

评论区