高精度演算法 (速用板子)

2021-10-09 14:03:20 字數 2166 閱讀 6083

前言:對於加減乘除運算,但是有時候某個數的位數過大,超過了long long,就不能用某個變數儲存了,這時候就得用陣列儲存數字的每一位,然後進行運算。

下面主要介紹四種高精度運算: 高精度 + 高精度   高精度 - 高精度   高精度 * 低精度   高精度 / 低精度   

首先是資料處理

輸入:

輸出:因為是逆序儲存,所以輸出也是逆序

接下來就是四種運算的了

高 + 高

#includeusing namespace std;

typedef long long ll;

//只適用於a的位數大於等於b的位數

vectoradd(vector&a, vector&b)

if(t) c.push_back(1); //把最後的進製儲存起來(不為0)

return c;

} int main()

高 - 高

#includeusing namespace std;

typedef long long ll;

//判斷兩數的大小關係

bool cmp(vector&a, vector&b)

//減法運算:只適用於a > b的情況

vectorsub(vector&a, vector&b)

while(c.size() > 1 && c.back() == 0) c.pop_back(); //去前導零

return c;

}int main()

//a <= b時

else

return 0;

}

高 * 低

#includeusing namespace std;

typedef long long ll;

//a * k

vectormul(vector&a, int k)

while(c.size() > 1 && c.back() == 0) c.pop_back(); //去前導零

return c;

}int main()

高 / 低

#includeusing namespace std;

typedef long long ll;

// 返回a/b 的結果,並求出餘數,因為要得到兩個值,因此餘數r傳引用

vectordiv(vector&a, int b, int &r)

//因為除法運算先得到的是高位,即上面步驟執行完,c內資料的順序就是結果的順序,然而主函式中輸出c是逆序輸出,因此根據負負得正的原則,這裡把c反轉一下

reverse(c.begin(), c.end());

while(c.size() > 1 && c.back() == 0) c.pop_back(); //去前導零

return c;

}int main()

高精度運算的精髓就是用陣列儲存每一位,讀者只需要根據日常加減乘除的運算步驟來看,就會很容易理解的;然後需要注意一些細節:比如去前導零,防止輸出-0,逆序儲存……總之,這些都是板子,記住板子就可做類似的題了!

常看我的部落格都知道,我的部落格講解就像金針菇那麼細,注釋都很詳細的。大神勿噴!

先看後好習慣哦~

高精度板子

include include include include include include include include include include include include include include include include include include using ...

高精度板子

include include include include include include include include include include include include include includeusing namespace std const int max 10001...

高精度板子

乘法學會fft以後,應該乘除都能優化很多。include include include include using namespace std int mi 28 const int maxlen 2e5 16,maxbit 1e8 int max int a,int b void plus1 並...