一、高精度"-"演算法
1.1 撰寫高精度"-",記住下面的內容,代碼也就游刃有余了!
(1) 首先采用高精度"+"同樣的處理方式來存盤大整數
(2) 其次存盤完,考慮如何運算?
二、高精度"-"演算法的核心
2.1 大整數存盤
? 無論是撰寫'+''-''*''/'哪一個,必須保證大整數的存盤格式相同,因為很多時候不僅僅有一個符號的運算,
2.2 減法運算的本質
? 大整數相減:C=A3A2A1A0-B2B1B0,要分兩種情況考慮,如果Ai-Bi-t夠減,則最終的位數為Ai-Bi-t,如果不夠減,最終的位數則為Ai-Bi-t+10,實際上就是(t+10)%10的兩種情況,
2.3 另外我們要知道
(1) 學會判斷處在陣列中的兩個大整數的大小,一般位數不同,長度更長的那個會更大些,如果位數相同,則從最高位比較,也就是陣列的最后一位,
(2) 如果A大于等于B——>直接算,否則——>-(B-A),
(3) 可能會出現前導零的情況,去除!
(4) 這里處理的是兩個正整數,如果是負整數,一定可以轉換位|A|+|B|或者|A|-|B|,
三、高精度"-"的代碼模板
"""
bool cmp(vector<int> &A,vector<int> &B)//判斷A是否大于等于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, 滿足A >= B, A >= 0, B >= 0
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);//分兩種情況考慮,如果Ai-Bi-t夠減,則最終的位數為Ai-Bi-t,如果不夠減,最終的位數則為Ai-Bi-t+10
if (t < 0) t = 1;
else t = 0;
}
while (C.size() > 1 && C.back() == 0) C.pop_back();//去掉前導零
return C;
}
查看更多
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/77837.html
標籤:其他
上一篇:高精度“+”演算法
