算法原理:
- 这个算法求的是高精度整数之间的减法
- 通过vector容器逆序存储被减数和减数,逐位相减,用变量 t 存储每一位的差,得到结果用vector容器存储并输出。
代码实现:
#include <iostream>
#include <cstdio>
#include <vector>
#include <string>
using namespace std;
bool Cmp(vector<int> &A, vector<int> &B); //声明比较函数
vector<int> Except(vector<int> &A, vector<int> &B); //声明求差函数
vector<int> Sub(vector<int> &A, vector<int> &B); //声明减法函数
int main()
{
string a, b; cin >> a >> b; //输入被减数a和减数b
vector<int> A, B; //创建vector容器存储被减数和减数
//将被减数和减数存入vector容器
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 = Sub(A, B); //减法运算,将结果存入vector容器C中
//输出求得的C
for (int i = C.size() - 1; i >= 0; i--)
{
printf("%d", C[i]);
}
return 0;
}
//定义比较函数,比较A和B的大小,若A大于B则返回true,否则返回false
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> Except(vector<int> &A, vector<int> &B)
{
vector<int> C; //定义差为C
int t = 0; //定义t表示逐位的差
for (int i = 0; i < A.size(); i++) //从低位向高位遍历
{
t += A[i]; //t先加上被减数A的每一位
if (i < B.size()) t -= B[i]; //再减去减数B相应的那一位
if (t < 0) { C.push_back(t + 10); t = -1; } //若结果t小于0,则需要借位,存入t+10,再将t置为-1,表示向高位借了位
else { C.push_back(t); t = 0; } //若结果t大于等于0,则无需借位,直接存入t,将t置为0即可
}
while (C[C.size() - 1] == 0 && C.size() > 1) C.pop_back(); //清除高位的无效0
return C;
}
//定义减法函数
vector<int> Sub(vector<int> &A, vector<int> &B)
{
if (Cmp(A, B)) return Except(A, B); //若A大于B,则直接用A减去B得到差
else { printf("-"); return Except(B, A); } //若A小于B,则先输出负号,再用B减去A得到答案
}
欢迎大家探讨