题目链接
引用
数组实现的看一看下面引用的题解;也有Java的实现方法,虽然Java有大数类;对压位感兴趣的小伙伴也可以看看
师大专升本16级学长 AcWing 792. 高精度减法(C语言新手版)
题目描述
给定两个正整数,计算它们的差,计算结果可能为负数。
样例
输入格式
共两行,每行包含一个整数。
输出格式
共一行,包含所求的差。
数据范围
输入样例:
32
11
输出样例:
21
算法
(高精度减法)
高精度减法和加法区别不大,存储的时候我们也是倒序存入数组中,因为我们都知道,减法的过程中是会向前借位的,同样的,如果最高位是1,借位后为0,那么我们就不能够直接输出数组元素,必须先去掉前导零;还有就是因为减法是会产生负数,所以在计算之前我们应该先比较两个数的大小,通过数组长度以及从最高位开始对应位的大小;还有就是借位了,有一个很巧妙的计算借位相减后的数字, (t + 10) % 10
怎么理解呢, t存的是对应位相减的结果无论结果是正数还是负数,计算后都会得到正确的结果,然后根据t是否大于零来判断是否借位了。
负数记得输出负号哦~~~
时间复杂度
根据数的长度决定循环的次数,所以时间复杂度也是线性的
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;
}