算法:高精度运算
算法:高精度运算
高精度加法 A+B
A/B中存放的是大正整数的每一位,并且是倒序存放的 :如:"12345678" =====>[6,5,4,3,2,1]
// C = A + B
vector<int> add(vector<int> &A, vector<int> &B)
{
vector<int> C;
int t = 0; //进位标致
for (int i = 0; i < A.size() || i < B.size(); i++)
{
if (i < A.size())
t += A[i];
if (i < B.size())
t += B[i];
C.push_back(t % 10);
t /= 10;
}
if (t)
C.push_back(1);
return C;
}
高精度减法A-B
确保A>B
// 判断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;
}
//C=A-B
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;
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;
}
高精度乘法 A*b
// C=A*b
vector<int> mul(vector<int> &A, int b)
{
vector<int> C;
int t = 0;
for (int i = 0; i < A.size() || t; i++)
{
if (i < A.size())
t += A[i] * b;
C.push_back(t % 10);
t /= 10;
}
return C;
}
高精度除法A/b,A%b
// C=A/b
vector<int> div(vector<int> &A, int b, int &r) //r代表余数
{
vector<int> C;
r = 0;
for (int i = A.size(); i >= 0; i--)
{
r = r * 10 + A[i];
C.push_back(r / b);
r %= b;
}
reverse(C.begin(), C.end()); //#include<algorithm>
while (C.size() > 1 && C.back() == 0) //去除前导0
C.pop_back();
return C;
}