C++高精度算法的使用場景詳解
更新時間:2022年09月09日 15:23:48 作者:1024節(jié)
在我們進行計算的過程中,經常會遇到幾十位,甚至幾百位的數(shù)字的計算問題,也有可能會遇到小數(shù)點后幾十位,幾百位的情況,而我們面對這樣的情況下,long long 和 double 的數(shù)據(jù)范圍顯然是不夠使用的了。因此這時,我們就需要引入一個新的算法,叫做高精度算法
描述
如果要計算的數(shù)超過了long long怎么解決? —>使用高精度加減乘除,簡單理解就是 很大的數(shù)進行加減乘除。
1. 高精度加法
1. 思路
- 創(chuàng)建對應的數(shù)組變量及其他變量
- 輸入字符串
- 將讀入的數(shù)據(jù)轉化為整數(shù)類型,并逆序(反轉)存儲到數(shù)組中
- 將兩個數(shù)組做累加(注意進位)
- 判斷最高位是否為0,大于0代表進位了,則讓長度加1
- 倒序輸出
2. 代碼
#include<bits/stdc++.h> using namespace std; int a[510], b[510], c[510];//a:被加數(shù) b:加數(shù) c:和 int main(){ // 1. 輸入字符串 string str1,str2; cin >> str1 >> str2; // 2. "1,2,3,4"轉換為{1,2,3,4},并且反轉 {4,3,2,1} for (int i = 0; i < str1.size(); i ++) a[str1.size()-1 - i] = str1[i] - '0'; for (int i = 0; i < str2.size(); i ++) b[str2.size()-1 - i] = str2[i] - '0'; // 3. 找兩個字符串最大的個數(shù),目的是為了將每一位計算完 int ans = max(str1.size(), str2.size()); // 4. 相加(a+b) for (int i = 0; i < ans; i ++){//遍歷至最大長度,避免有的數(shù)字沒計算 c[i] += a[i] + b[i];//相加 c[i+1] = c[i] / 10;// 進位 c[i] %= 10;//將加的結果求余10 得出第i位 } //4. 如果結果數(shù)組第ans位的數(shù)大于0(大于0代表進位了),則讓長度增加1 while(c[ans]>0) ans++; //5. 倒序輸出 for (int i = ans-1; i >= 0; i--) cout << c[i]; return 0; }
#include<bits/stdc++.h> using namespace std; int a[500],b[500],c[501],ans[501],len_a,len_b,len_ans;//a:加數(shù)1 b:加數(shù)2 c:進位數(shù)組 ans:結果數(shù)組 int main(){ // 1. 輸入字符串 string str1,str2; cin >> str1 >> str2; len_a = str1.length(); len_b = str2.length(); // 2. "1,2,3,4"轉換為{1,2,3,4},并且反轉 {4,3,2,1} for (int i = 0; i < str1.size(); i ++) a[str1.size()-1 - i] = str1[i] - '0'; for (int i = 0; i < str2.size(); i ++) b[str2.size()-1 - i] = str2[i] - '0'; // 3. 找兩個字符串最大的個數(shù),目的是為了將每一位計算完 len_ans = max(len_a,len_b); // 4. 相加(a+b) for(int i=0;i<=len_ans;i++){ ans[i] = a[i] + b[i] + c[i];//結果數(shù)組 =(等于) 被加數(shù) 加上 加數(shù) 加上 進位的數(shù) if(ans[i] > 9){//如果結果數(shù)組大于9,則進位 c[i+1] = ans[i] / 10;//給進位數(shù)組賦值 ans[i] %= 10; // 讓結果數(shù)組大于9的數(shù)求余10,變成個位數(shù) } } //5. 如果結果數(shù)組len_ans位的數(shù)大于0,則讓長度增加1 while(ans[len_ans]>0) len_ans++; //6. 倒敘輸出 for(int i=len_ans-1;i>=0;i--) cout<<ans[i]; return 0; }
2. 高精度減法
1. 思路
- 定義被減數(shù)a,減數(shù)b,結果c數(shù)組
- 輸入被減數(shù)和減數(shù),并且將數(shù)據(jù)倒敘存入數(shù)組中。
- 找兩個字符串最大的個數(shù),目的是為了將每一位計算完
- 將兩個數(shù)組做相減(遍歷至最大長度,避免有的數(shù)字沒計算 )。
- 去掉前導 0 。例如結果為:089,不需要0
- 循環(huán)遍歷輸出
2. 代碼
#include<bits/stdc++.h> using namespace std; int a[510], b[510], c[510];//a:被減數(shù) b:減數(shù) c:結果 int main(){ // 1. 輸入字符串 string str1,str2; cin >> str1 >> str2; // 2. "1,2,3,4"轉換為{1,2,3,4},并且反轉 {4,3,2,1} for (int i = 0; i < str1.size(); i ++) a[str1.size()-1 - i] = str1[i] - '0'; for (int i = 0; i < str2.size(); i ++) b[str2.size()-1 - i] = str2[i] - '0'; // 3. 找兩個字符串最大的個數(shù),目的是為了將每一位計算完 int ans = max(str1.size(), str2.size()); // 4. 相減(a-b) for (int i = 0; i < ans; i ++){//遍歷至最大長度,避免有的數(shù)字沒計算 if(a[i] < b[i]){ a[i+1] -= 1;//向前借一位 a[i] += 10;// 借一位以后加10 } c[i] = a[i] - b[i]; } //5. 如去掉前導 0 。例如結果為:089,不需要0 while(c[ans-1]==0 && ans>1) ans--; //6. 倒序輸出 for (int i = ans-1; i >= 0; i--) cout << c[i]; return 0; }
#include<bits/stdc++.h> using namespace std; int a[500],b[500],c[501],ans[501],len_a,len_b,len_ans;//a:被減數(shù) b:減數(shù) c:進位 ans:結果 int main(){ // 1. 輸入字符串 string str1,str2; cin >> str1 >> str2; len_a = str1.length(); len_b = str2.length(); // 2. "1,2,3,4"轉換為{1,2,3,4},并且反轉 {4,3,2,1} for (int i = 0; i < str1.size(); i ++) a[str1.size()-1 - i] = str1[i] - '0'; for (int i = 0; i < str2.size(); i ++) b[str2.size()-1 - i] = str2[i] - '0'; // 3. 找兩個字符串最大的個數(shù),目的是為了將每一位計算完 len_ans = max(len_a,len_b); // 4. 相減(a-b) for(int i=0;i<=len_ans;i++){ ans[i] = a[i] - b[i] - c[i];//結果數(shù)組 =(等于) 被減數(shù) 減去 減數(shù) 減去 進位的數(shù) if(ans[i] < 0){//如果結果數(shù)組小于0,則借位 ans[i] += 10;// 借1位,加上10 c[i+1]++; // 進位數(shù)組加1 } } //5. 如去掉前導 0 。例如結果為:089,不需要0 while(len_ans>1 && ans[len_ans-1]==0) len_ans--; //6. 倒序輸出 for(int i=len_ans-1;i>=0;i--) cout<<ans[i]; return 0; }
3. 如果出現(xiàn)被減數(shù)的位數(shù)小于減數(shù)時呢
#include<bits/stdc++.h> using namespace std; int a[510], b[510], c[510];//a:被減數(shù) b:減數(shù) c:結果 int flag = 0; int main(){ // 1. 輸入字符串 string str1,str2; cin >> str1 >> str2; //2. str1.size() < str2.size() 或者 兩個數(shù)一樣長并且被減數(shù)的數(shù)值小于減數(shù)時,才需要交換兩數(shù)位置 if(str1.size() < str2.size() || str1.size() == str2.size() && str1 < str2) { string t = str1; str1 = str2; str2 = t; flag = 1; } // 3. "1,2,3,4"轉換為{1,2,3,4},并且反轉 {4,3,2,1} for (int i = 0; i < str1.size(); i ++) a[str1.size()-1 - i] = str1[i] - '0'; for (int i = 0; i < str2.size(); i ++) b[str2.size()-1 - i] = str2[i] - '0'; // 4. 找兩個字符串最大的個數(shù),目的是為了將每一位計算完 int ans = max(str1.size(), str2.size()); // 5. 相減(a-b) for (int i = 0; i < ans; i ++){//遍歷至最大長度,避免有的數(shù)字沒計算 if(a[i] < b[i]){ a[i+1] -= 1;//向前借一位 a[i] += 10;// 借一位以后加10 } c[i] = a[i] - b[i]; } //6.如去掉前導 0 。例如結果為:089,不需要0 while(c[ans-1]==0 && ans>1) ans--; //7. 倒敘輸出 if(flag == 1) cout<<"-"; for (int i = ans-1; i >= 0; i--) cout << c[i]; return 0; }
到此這篇關于C++高精度算法的使用場景詳解的文章就介紹到這了,更多相關C++高精度算法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
解決C++ fopen按行讀取文件及所讀取的數(shù)據(jù)問題
今天小編就為大家分享一篇解決C++ fopen按行讀取文件及所讀取的數(shù)據(jù)問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07QTableWidget設置只讓某一列可編輯的實現(xiàn)
本文介紹了如何將QTableWidget的某一列設置為可編輯,以便用戶可以輸入自定義數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-08-08一篇文章讓你輕松理解C++中vector和list區(qū)別
對于學c語言的同學來說,vector和list這兩個東西經常會搞錯,下面這篇文章主要給大家介紹了關于C++中vector和list區(qū)別的相關資料,需要的朋友可以參考下2022-01-01C語言實現(xiàn)從文件讀入一個3*3數(shù)組,并計算每行的平均值
今天小編就為大家分享一篇C語言實現(xiàn)從文件讀入一個3*3數(shù)組,并計算每行的平均值,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12