由于在C++中的数不像Python中的数一样能无限大,由此一但遇到数的位数比较多的时候,就不能进行运算。
因此,我们就需要采取一些其他的方法来进行高精度运算。
高精度运算的方法有很多,我这里主要用的是vector进行模拟。
1、高精度加法运算:
直接上代码
#include<iostream>
#include<vector>
using namespace std;
vector<int> add(vector<int> A, vector<int> B)
{
int t = 0;//t表示是否进位
vector<int>C;
for (int i = 0; i < max(A.size(), B.size()); i++)
{
int sum = 0;
sum += t;
if (i < A.size())sum += A[i];
if (i < B.size())sum += B[i];
C.push_back(sum % 10);
t = sum / 10;
}
if (t)C.push_back(t);
return C;
}
int main()
{
string a, b;
cin >> a >> b;//以字符串的形式输入数字
vector<int> A, B;
for (int i = a.size() - 1; i >= 0;i--)A.push_back(a[i] - '0');//将字符串转换成vector的形式
for (int j = b.size() - 1; j >= 0; j--)B.push_back(b[j] - '0');
vector<int> C = add(A, B);
for (int i = C.size() - 1; i >= 0; i--)cout << C[i];//输出结果;
}
输入 9999999999999999999999999999999999999999999 9999999999999999999999999999999999999999999 时
输出结果:
2、高精度减法运算:
直接上代码
#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)
{
vector<int> C;
for (int i = 0, t = 0; i < A.size(); i++)
{
t = A[i] - t;//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();//去除前导0
return C;
}
int main()
{
string a, b;
cin >> a >> b;//以字符串的形式输入数字
vector<int> A, B;
for (int i = a.size() - 1; i >= 0;i--)A.push_back(a[i] - '0');//将字符串转换成vector的形式
for (int j = b.size() - 1; j >= 0; j--)B.push_back(b[j] - '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];
}
输入 11111111111111111111111111111111111111111111111111111111111111111111111111111111
22222222222222222222222222222222222222222222222222222222222222222222222222222222
输出结果: