AcWing 演算法基礎課 大整數、高精度
大整數用陣列表示
第一位寫在index=0的位置,因為運算可能進位。
vector<int> 自帶size(),方便表示大整數;
輸出的時候要反向
高精度加法
要記得最後加上carry
vector<int> add(vector<int> &A, vector<int> &B)
{
if (A.size() < B.size()) return add(B, A);
vector<int> C;
int t = 0;
for (int i = 0; i < A.size(); i ++ )
{
t += A[i];
if (i < B.size()) t += B[i];
C.push_back(t % 10);
t /= 10;
}
if (t) C.push_back(t);
return C;
}
作者:yxc
連結:https://www.acwing.com/blog/content/277/
來源:AcWing
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
高精度減法
要先判斷減數和被減數的大小
刪除前導零
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');
function<vector<int>(vector<int>&, vector<int>&)> BigNumberMinus = [](vector<int> &A, vector<int> &B)
{
int c = 0;
vector<int> res;
for (int i = 0; i < A.size() ; i++)
{
int num=c;
num += A[i];
if (i < B.size()) num -= B[i];
res.push_back((num+10) % 10);
c = num<0?-1:0;
}
while (res.size() > 1 && res.back() == 0) res.pop_back();//刪除前導零
return res;
};
bool greater = true;;
if (A.size() > B.size())
greater = true;
else if (A.size() < B.size())
greater = false;
else
{
for (int i = 0; i < A.size(); i++)
{
if (A[i] < B[i])
{
greater = false;
break;
}
if (A[i] > B[i])
{
greater = true;
break;
}
}
}
vector<int> C;
if (greater) C = BigNumberMinus(A, B);
else
C = BigNumberMinus(B, A);
if (!greater)
cout << '-';
for (int i = C.size() - 1; i >= 0; i--)
cout << C[i];
cout << endl;
return 0;
}
高精度乘法(大數乘小數)
通過大數的每一位乘小數(加上進位)
function<vector<int>(vector<int>&, int)> BigNumberMul = [](vector<int> &A, int b)
{
int c = 0;
vector<int> res;
for (int i = 0; i < A.size() ; i++)
{
int num=c;
num += A[i]*b;
res.push_back(num % 10);
c = num/10;
}
while (c!=0) res.push_back(c%10),c/=10;
return res;
};