高精度减法(动态数组)(两个正数相减)

该代码实现了一个C++程序,用于执行高精度减法操作。它首先接收两个字符串表示的大整数,然后通过动态数组处理并逆序存储数字,比较字符串长度和单个字符来确定减法规则。在处理过程中移除了前导零,并根据数值大小决定是否添加负号。最后,程序倒序输出结果。
摘要由CSDN通过智能技术生成

思路:

①首先输入字符串a,b;

②然后再创建动态数组,经行倒着存贮

③减法不同于加法和乘法只比较字符串的长度,减法计算中存在着很多的:长度长的字符串一定大于短的字符串;长度一致的字符串,不一定相等,所以需要开循环进行比较,直到比较出现不一样的字符为止,我们这里判断是返回的第一个字符是否大于等于第二个字符,如果是则返回真,反之,返回否;

④倒着输出会出现前导零的情况,所以需要开循环去掉前导零;

⑤因为我们是倒着相加的,所以输出也要是倒着输出结果,同时我们在写程序计算时是保证第一个数大于第二个数的,所以结果都是正数,所以在判断大小时需要判断输出时是否需要加负号

例题:

https://www.luogu.com.cn/problem/P2142

洛谷高精度减法

 

#include <bits/stdc++.h>
using namespace std;
vector<int> sub(vector<int>&A,vector<int>&B){
	vector<int> C;
	int t=0;//用于记录上一位是否借位 
	for(int i=0;i<A.size();i++){
		t=A[i]-t;
		if(i<B.size())t-=B[i];
		C.push_back((t+10)%10);
		if(t<0)t=1;
		else t=0;
	}
	while(C.size()>1&&C.back()==0)C.pop_back();//如何去除前导零
	return C;
}

bool cmp(vector<int>&A,vector<int>&B){
	//字符串长度不相等的情况 
	if(A.size()!=B.size())return A>B;
	//字符串长度相等的情况
	//结束循环的条件就是知道出现两个字符不相等的情况 
	for(int i=0;i<A.size();i++){
		if(A[i]!=B[i])return A[i]>B[i];
	}
	//如果两个字符串长度和字符一模一样 
	return true;
}
int main()
{
	string a,b;
	cin>>a>>b;
	vector<int> A,B,C;
	for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');
	for(int i=b.size()-1;i>=0;i--)B.push_back(b[i]-'0');
	if(cmp(A,B)){
		C=sub(A,B);
		for(int i=C.size()-1;i>=0;i--)printf("%d",C[i]);
	}else{
		C=sub(B,A);
		printf("-");
		for(int i=C.size()-1;i>=0;i--)printf("%d",C[i]);
	}
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值