今天我们来讲一下高精度减法
首先什么是高精度减法呢?☹️☹️☹️
我们来看一下百度是怎么介绍高精度减法的,没想到百度居然偷懒,那我也顺带放上高精度加法的介绍吧。
也可以看看我之前对于高精度加法的介绍
高精度减法和加法区别不大,存储的时候我们也是倒序存入数组中,因为我们都知道,减法的过程中是会向前借位的,同样的,如果最高位是1,借位后为0,那么我们就不能够直接输出数组元素,必须先去掉前导零;还有就是因为减法是会产生负数,所以在计算之前我们应该先比较两个数的大小,通过数组长度以及从最高位开始对应位的大小;还有就是借位了,有一个很巧妙的计算借位相减后的数字, (t + 10) % 10
怎么理解呢, t存的是对应位相减的结果无论结果是正数还是负数,计算后都会得到正确的结果,然后根据t是否大于零来判断是否借位了。
负数记得输出负号哦~~~
接下来我们来看看模板👇👇👇
bool cmp(vector<int> &A , vector<int> &B)
{
if(A.size() != B.size()) return A.size() > B.size();// 如果位数不相等,返回A > B 的结果
// 遍历A与B的每一位,此时位数相同,用A或者B的size都行,只要有一位不同,就返回A[i] > B[i] 的结果
for(int i = A.size() -1; i >= 0; i --)
if(A[i] != B[i]) return A[i] > B[i];
return true;
}
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;
}
cmp函数是比较减数与被减数的大小,sub函数就是减法的具体内容了
模板内容就这么多,很好理解的,输出的时候记得倒序输出
那么我们来一道模板题练练手👏👏👏
题目描述
给定两个正整数,计算它们的差,计算结果可能为负数。
输入格式
共两行,每行包含一个整数。
输出格式
共一行,包含所求的差。
数据范围
$1≤整数长度≤105$
输入样例:
32
11
输出样例:
21
C++代码
#include <iostream>
#include <vector>
using namespace std;
vector<int> A , B;
string a , b;
bool cmp(vector<int> &A , vector<int> &B)
{
if(A.size() != B.size()) return A.size() > B.size();
for(int i = A.size() - 1; i >= 0; i --)
if(A[i] != B[i])
return A[i] > B[i];
return true;
}
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;
}
int main()
{
cin >> a >> b;
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');
vector<int> C;
if(cmp(A , B)) C = sub(A , B);
else C = sub(B , A) , cout << '-' ;
for(int i = C.size() - 1; i >= 0; i --) cout << C[i];
return 0;
}
引用
数组实现的看一看下面引用的题解;也有Java的实现方法,虽然Java有大数类;对压位感兴趣的小伙伴也可以看看🤺🤺🤺
师大专升本16级学长 AcWing 792. 高精度减法(C语言新手版)