??作者主頁(yè):慢熱的陜西人
??專(zhuān)欄鏈接:C++算法
??歡迎各位大佬??點(diǎn)贊??關(guān)注??收藏,??留言
主要講解了高精度算法的四種常用的計(jì)算
Ⅲ. 高精度
以下數(shù)字均指位數(shù)
①A + B(精度均在10^6)
②A(yíng) - B (精度均在10^6)
③A * b (len(A) <= 10^6, a <= 1000);
④A / b (len(A) <= 10^6, a <= 1000);
Ⅲ. Ⅰ . A + B:
思路:將兩個(gè)大數(shù)先用字符串保存,然后再倒序存入到數(shù)組中(這是因?yàn)槲覀冊(cè)谶\(yùn)算的時(shí)候會(huì)產(chǎn)生進(jìn)位)。然后再實(shí)現(xiàn)一個(gè)add函數(shù)實(shí)現(xiàn)加法,將運(yùn)算的結(jié)果存儲(chǔ)到一個(gè)數(shù)組中:
代碼:
#include <iostream> #include <vector> using namespace std; 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; } int main() { string a, b; vector<int> A, B; cin >> a >> b; //將A和B存儲(chǔ)在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'); auto C = add(A, B); for (int i = C.size() - 1; i >= 0; --i) printf("%d", C[i]); return 0; }
Ⅲ. Ⅱ . A - B:
思路:存儲(chǔ)思路都是統(tǒng)一的,需要一個(gè)借位t.
每一位的計(jì)算:
x = Ai - Bi - t
,如果x
大于零那么本位減法的結(jié)果就是x
,如果x
小于零那么需要在x
結(jié)果的基礎(chǔ)上加上10
總結(jié)果的計(jì)算:如果
A >= B
那么結(jié)果就是A - B,如果A < b
那么結(jié)果就是-(B - A)
在計(jì)算之前我們要保證每次都是大數(shù)減小數(shù),所以要先實(shí)現(xiàn)一個(gè)
cmp
函數(shù)來(lái)比較哪一個(gè)數(shù)字大。代碼:
#include <iostream> #include <vector> using namespace std; bool cmp(vector<int>& A, vector<int>& B) { //位數(shù)不同 if (A.size() != B.size()) return A.size() > B.size(); //位數(shù)相同 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; //計(jì)算本位 if (i < B.size()) t -= B[i]; C.push_back((t + 10) % 10); if (t < 0) t = 1; else t = 0; } //去除前導(dǎo)零 while (C.size() > 1 && C.back() == 0) C.pop_back(); return C; } int main() { string a, b; vector<int> A, B; cin >> a >> b; //將A和B存儲(chǔ)在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'); if (cmp(A, B)) { auto C = sub(A, B); for (int i = C.size() - 1; i >= 0; --i) printf("%d", C[i]); } else { auto C = sub(B, A); printf("-"); for (int i = C.size() - 1; i >= 0; --i) printf("%d", C[i]); } return 0; }
Ⅲ. Ⅲ. A * b:
思路:存儲(chǔ)數(shù)據(jù)的思路不變,特別的點(diǎn)在于對(duì)進(jìn)位和本位計(jì)算的處理。
例如:我們要計(jì)算123 * 12。
首先我們將
3 * 12 + t
存到t
里面,那么本位就是t % 10 = 6
, 而進(jìn)位就是t / 10 = 3
;以此類(lèi)推將
2 * 12 + t
存到t
里面,那么本位就是t % 10 = 7
,而進(jìn)位就是t / 10 = 2
;最后我們將
1 * 12 + t
存到t
里面,那么本位就是t % 10 = 4
, 而進(jìn)位就是t / 10 = 1
最后如果
t
不為零的話(huà),那么最高位的值就是繼續(xù)將t
進(jìn)行分解。代碼:
#include <iostream> #include <vector> using namespace std; vector<int> mul(vector<int>& A,int b) { vector <int> C; for (int i = 0, t = 0; t || i < A.size(); ++i) { if (i < A.size()) t += A[i] * b; C.push_back(t % 10); t /= 10; } return C; } int main() { string a; int b; vector<int> A; cin >> a >> b; //將A和B存儲(chǔ)在a和b的字符串中 for (int i = a.size() - 1; i >= 0; --i) A.push_back(a[i] - '0'); auto C = mul(A, b); for (int i = C.size() - 1; i >= 0; --i) printf("%d", C[i]); return 0; }
Ⅲ. Ⅲ. A / b:
思路:A / B 的話(huà)我們是從高位開(kāi)始計(jì)算的,而且計(jì)算機(jī)每次只能計(jì)算一位。
那么我們每次計(jì)算都將余數(shù)存儲(chǔ)在
r
中,然后每次都將r * 10
,最后再加上除數(shù)的本位,然后再次計(jì)算余數(shù),直到除數(shù)計(jì)算完成。代碼:
#include <iostream> #include <vector> using namespace std; //A 是除數(shù), b是被除數(shù),r是余數(shù) vector<int> div(vector<int>& A,int b, int &r) { vector <int> C; r = 0; for (int i = A.size() - 1; i >= 0; --i) { r = r * 10 + A[i]; C.push_back(r / b); r %= b; } //反轉(zhuǎn)為標(biāo)準(zhǔn)的存儲(chǔ)格式 reverse(C.begin(),C.end()); //去掉前導(dǎo)零 while (C.size() > 1 && C.back() == 0) C.pop_back(); return C; } int main() { string a; int b; int r = 0; vector<int> A; cin >> a >> b; //將A和B存儲(chǔ)在a和b的字符串中 for (int i = a.size() - 1; i >= 0; --i) A.push_back(a[i] - '0'); auto C = div(A, b, r); for (int i = C.size() - 1; i >= 0; --i) printf("%d", C[i]); cout << endl << r; return 0; }
到這本篇博客的內(nèi)容就到此結(jié)束了。
如果覺(jué)得本篇博客內(nèi)容對(duì)你有所幫助的話(huà),可以點(diǎn)贊,收藏,順便關(guān)注一下!
如果文章內(nèi)容有錯(cuò)誤,歡迎在評(píng)論區(qū)指正文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-597774.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-597774.html
到了這里,關(guān)于C++基礎(chǔ)算法高精度篇的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!