C++高精度减法
两个数减法运算,会出现负数的情况,两个数的位数是10万级。
输出:
一行,减法运算结果。
题解:
该题由于数据的位数较大,所以将数据以字符形式读入,然后经过运算之后,再通过数值形式输出。
- 首先将两个数读入,读入两个字符串
- 将字符串转换成数值类型,放在容器里面,A.push_back(data);放数据的时候是从A[0]开始放
- 调用构造的减法函数
- 先判断两个数谁大,谁小,我们用大的数值减去小的数值,最后输出的时候,判断是否输出负号。
- 减法从最低为开始运算,如果该为减法之后出来的结果是负值,则需要借位
- 如果被减数没有了,则直接用减数位减去借位。
- 每一位通过C.push_back();放在C里,从0(地位)——到高位存,低位数存低位地址里。
- 输出的时候先判断正负,再输出C里面的值,从高位倒着输出。
#include <iostream>
#include <vector>
using namespace std;
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)
{
if(!cmp(A, B))
{
return sub(B, A);
}
vector<int> C;
int b = 0;//借位
int t = 0;//当前位结果
for(int i = 0; i < A.size(); i++)
{
if(i < B.size()) t = A[i] - B[i] - b;
else t = A[i] - b;
if(t < 0)
{
b = 1;
C.push_back(t + 10);
}
else
{
b = 0;
C.push_back(t);
}
}
while(C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
int main()
{
string a, b;
vector<int> A, B;
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');
auto C = sub(A, B);
if(!cmp(A, B))
{
printf("-");
}
for(int i = C.size() - 1; i >= 0; i--) printf("%d", C[i]);
return 0;
}
巧妙的程序:
其中,两个数比较大小的程序比较巧妙,通过一个bool类型的返回值,判断是否是A>=B。
- A >= B 返回:true
- A < B 返回:false
当 return A[i] > B[i] 时,如果满足条件,则返回true, 如果条件不满足,则返回false。
比较两个数的大小,先通过两个数的位数比较,如果位数相同,再从高位向低位逐位比较,当出现不相等的位时就可以判断,哪个大了。
活动地址:毕业季·进击的技术er