高精度减法指的是大整数的相减,大整数是用基本数据类型无法存储其精度的整数,位数不超过10^6,注意是位数,不是数值的大小。
因为其精度超过基本的数据类型规定的大小,所以常规的计算方法是不可以实现的,这里可以借助STL中的vector容器来实现,vector其实可以认为是一个数组。先用string接收要进行相加的大整数,再赋给vector容器。string是一个字符串型,转换成数字的时候要 -- ’0‘,让其从一个字符变成一个真正的数字。
string a, b;
vector<int>A, B;
cout << "输入两个数" << endl;
cin >> a >> b;
for (int i = a.size() - 1; i >= 0; i--)
{
A.push_back(a[i] - '0');
}
for (int j =b.size() - 1; j >= 0; j--)
{
B.push_back(b[j] - '0');
}
上述代码是实现字符串的输入和容器接收字符使之变为数字
上述的代码是实现两个容器分别接收数据。为什么要反方向接收呢?即让位小的先存入容器
比如数123456,存储容器的顺序是65431,如果说顺序存储的话按照123456顺序存储的话,两个数相加后位数最高的位满10向前进1,需要移动容器的数据依次向后移动一位,这样会造成不必要的麻烦,所以我们反方向存储
注:vector需要引用头文件#include<vector>
减法比加法多的一步是判断大整数谁的位数更多,始终让位数多的 -- 位数少的,最后在打印的前面加个符号就可以了
//判断谁的位数多
bool cmp(vector<int>& A, vector<int>& B)
{
if (A.size() != B.size())
{
return A.size() > B.size();
}
else if (A.size() == B.size())
{
for (int i = A.size() - 1; i >= 0; i--)
{
if (A[i] != B[i])
{
return A[i] > B[i];
}
}
}
}
if (cmp(A,B))
{
auto C = sub(A, B);
for (int i = C.size()-1; i >=0; i--)
{
printf("%d", C[i]);
}
}
else
{
auto C = sub(B, A);
printf("-");
//打印
for (int i = C.size() - 1; i >= 0; i--)
{
printf("%d", C[i]);
}
}
vector<int>sub(vector<int>& A, vector<int>& B)
{
vector<int>C;
int k = 0;
int t = 0;
for (int i = 0; i <A.size(); i++) //从0开始,因为vector中是让位小的先存入vector中,比如存12345到容器中,其实容器存的是54321
{
k = A[i] - t;
if (B.size() >= i)
{
k -= B[i];
}
C.push_back((k + 10) % 10);
if (k < 0)
{
t = 1;
}
else
{
t = 0;
}
}
//删除头部0
while (C.size() > 1 && C.back() == 0)
{
C.pop_back();
}
return C;
}
这里的删除头部0,比如22 - 20,结果是02.不是2,所以要加这么一段代码来删除头部0
//高精度A-B
//判断哪个位数更多
bool cmp(vector<int>& A, vector<int>& B)
{
if (A.size() != B.size())
{
return A.size() > B.size();
}
else if (A.size() == B.size())
{
for (int i = A.size() - 1; i >= 0; i--)
{
if (A[i] != B[i])
{
return A[i] > B[i];
}
}
}
}
//实现减法
vector<int>sub(vector<int>& A, vector<int>& B)
{
vector<int>C;
int k = 0;
int t = 0;
for (int i = 0; i <A.size(); i++) //从0开始,因为vector中是让位小的先存入vector中,比如存12345到容器中,其实容器存的是54321
{
k = A[i] - t;
if (B.size() >= i)
{
k -= B[i];
}
C.push_back((k + 10) % 10);
if (k < 0)
{
t = 1;
}
else
{
t = 0;
}
}
while (C.size() > 1 && C.back() == 0)
{
C.pop_back();
}
return C;
}
int main()
{
string a, b;
vector<int>A, B;
cout << "输入两个数" << endl;
cin >> a >> b;
for (int i = a.size() - 1; i >= 0; i--)
{
A.push_back(a[i] - '0');
}
for (int j =b.size() - 1; j >= 0; j--)
{
B.push_back(b[j] - '0');
}
if (cmp(A,B))
{
auto C = sub(A, B);
for (int i = C.size()-1; i >=0; i--)
{
printf("%d", C[i]);
}
}
else
{
auto C = sub(B, A);
printf("-");
//打印
for (int i = C.size() - 1; i >= 0; i--)
{
printf("%d", C[i]);
}
}
system("pause");
return 0;
}