【模版】高精度减法 (A - B problem)

发布时间 2023-12-25 16:40:04作者: 綾川雪絵

直接看代码和注释吧qwq高精度就是模拟嘛ww

还是python好,自带高精度

#include<bits/stdc++.h>
#define MAXN 10500 

using namespace std;

string a, b;
//选择字符串。因为字符串储存了每个串的长度,可以直接调用。
int na[MAXN], nb[MAXN], ans[MAXN]; 
bool pd;

int main()
{
    cin >> a >> b;
	if((a < b && a.size() == b.size()) || a.size() < b.size())
	{
		swap(a, b);
		pd = true; //判断a-b为负数的情况,其实也就是转化为-(b-a)
	}
    for(int i = a.size(); i > 0; i --)na[i] = a[a.size() - i] - '0';
    for(int i = b.size(); i > 0; i --)nb[i] = b[b.size() - i] - '0';
    //将字符串中的信息转化到数组中,数组模拟数字。 
    int maxl = max(a.size(), b.size());
    //找到两个数中的最大位,为for循环服务 
	for(int i = 1; i <= maxl; i ++)
	{
		if(na[i] < nb[i])
		{
			na[i + 1] --; //模拟借位
			na[i] += 10;
		}
		ans[i] = na[i] - nb[i];
	}
	
	while(ans[maxl] == 0)maxl --;//防止减后降位,多输出若干0 
	
	if(pd == true)cout << "-";//b>a时,a - b < 0 所以打上负号 
	
	for(int i = maxl; i > 0; i --)cout << ans[i];
	if(maxl < 1)cout << "0";。//相减等于0的情况
    return 0;
}

 

这里需要一提的是判断 b>a的方法。很显然,这里a,b都是字符串型。为什么要这么写?

这里涉及字典序的比较大小方式。string类型不是不能比大小,而是规则上有所不同

粗略地概括一下:

从最高位比起,ASCII码更大的字符串更大。如果相等,比次高位,以此向下类推。

所以在string中,串 9>89 。因为最高位9>8

当然,像前面几个数如果都相等,位数更大的显然更大。

例如1234500>12345

所以说:在位数相等的时候,我们可以直接利用字符串比大小的性质,来比较两数大小,但又要防止出现 9>89这种情况,所以还要保证位数大的数值才更大