算法题(119):高精度减法

审题:

本题高精度减法主要是要区分正负号,然后进行模拟

思路:
方法一:模拟法

首先本题需要我们利用字符串进行大数相减

第一步:区分s1和s2谁更大

先从数的位数进行判断,然后再从高到低的位数进行判断

第二步:确认谁大谁小后进行减法模拟

利用minus控制借位,借了为就置为-1,没有借就置为0

解题:

(1)主函数逻辑

int main()
{
	cin >> s1 >> s2;
	bool judge = true;
	//判断大小
	if (s1.size() > s2.size())
	{
		minor(s1, s2);
		judge = false;
	}
	else if(s1.size()<s2.size())
	{
		minor(s2, s1);
	}
	else
	{
		int i = 0;
		while (i < s1.size() )
		{
			if (s1[i] >= s2[i])
			{
				minor(s1, s2);
				judge = false;
				break;
			}
			else if (s1[i] < s2[i])
			{
				minor(s2, s1);
				break;
			}
				i++;
		}
	}
	if (judge)//负数
	{
		cout << '-' << output;
	}
	else//正数
	{
		if (output[0] == '0'){
			cout << 0;
		}
		else{
			cout << output;
		}
	}
	return 0;
}

第一步:判断大小并确认进入减法模拟的参数顺序,将大的数放在前面传参,小的数放在后面传参。并且用judge记录数的最终正负号,若是正数就是false,负数就是true

第二步:根据judge的状态对output进行输出

特殊处理:如果结果为0需要特殊处理,否则会输出很多个0

(2)减法模拟

void minor(string s1, string s2)
{
	int minus = 0;//负数
	size_t big = s1.size();
	size_t small = s2.size();
	while (big > 0 || small > 0)
	{
		int cur = minus;
		if(big > 0)
		{
			big--;
			cur += s1[big]-'0';
		}
		if (small > 0)
		{
			small--;
			cur -= s2[small]-'0';
		}
		char ch;
		if (cur < 0)//需要借位
		{
			 ch = cur + 10 + '0';
			minus = -1;
		}
		else//无需借位
		{
			 ch = cur + '0';
			minus = 0;
		}
		output = ch + output;
	}
}

最终的数分两步进行计算

第一步:将借位数minus,s1字符串对应位和s2字符串对应位进行计算

第二步:若结果为负数就需要借位,将minus置为-1,不为负数就不用借位,将minus置为0

补充:其实在判断谁大谁小的size相同部分我们也可以用strcmp直接比较字符串,因为strcmp的比较逻辑就是依次比较从0索引开始的字符

P2142 高精度减法 - 洛谷

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值