大数高精度加减、乘除、开根(C++版全套最详细、最易懂)
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                大数高精度加减、乘除、开根(C++版全套最详细、最易懂)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                大數高精度加減、乘除、開根
- 一、前面鋪墊
- 二、加法
- 三、減法
- 四、乘法
- 五、除法
- 六、開根(待完善)
??大數高精度加減乘除主要用在超過long型的數字計算(比如1000位數), 最基本的思路就是換成string類型變量 / char數組進行計算,小白在這里胡說八道,有不足的歡迎大大、juju們斧正v( ?? ω ?? )?
一、前面鋪墊
??這里主要用到兩個函數,moveFrontZero()用來去除前面的0且一般用在最后將要輸出結果的時候,align()用來給短的數字補0至兩個數有相同位數(相同長度)。
/** 去除前面的0 */ void moveFrontZero(string &res){res.erase(0, res.find_first_not_of('0'));if(res.empty()) res = "0"; }/** 補位對齊并返回最長的長度 */ int align(string &a, string &b){while(a.length() < b.length()) a = "0" + a;while(b.length() < a.length()) b = "0" + b;return a.length(); }?
二、加法
??從最低位(個位)開始對應相加,超過10就進位+1,通過拼接字符串形成計算結果。
 ??可對應洛谷題:👉洛谷題👈
?
三、減法
??從低位開始對應相減,不夠減就從借位減一。這里實現的還不是很優(有待優化),因為有個前提——兩個數都必須是整數且不是負數。
string sub(string &a, string &b){ //subductionstring res;int len = align(a, b);bool flag = false; //用來判斷最后結果是否為負數if(a<b){flag = true;a.swap(b); //確保a是最大數}for(int i = len-1; i >= 0; i--){int num1 = a[i] - '0';int num2 = b[i] - '0';if(num1 < num2){// -'0'-1是為了借位,+'0'是為了還原成char類型字符a[i-1] = a[i-1]-'0' - 1 + '0';res = to_string(num1+10 - num2) + res;}else{res = to_string(num1 - num2) + res;}}moveFrontZero(res);if(flag) res = "-" + res;return res; }?
四、乘法
?主要思想是把乘法轉換成加法運算,分割相對小的數,如:
 12345×24 可分割24成4個12345相加,20個123456相加(也就是2個123450相加),即 12345×24 = 4×12345 + 2×123450
??看下圖數據更易懂~
 首先初始化
 
 循環加上4次加上12345后結果res=49380
 
 重復,循環2次加上123450,res=296280
 
 ?
五、除法
??這里用的是算商數、余數的除法,而直接除的算法有待研究和優化。
 鏈接:👉大數除法👈
 下面附上鏈接里算法的修正版式
六、開根(待完善)
??題目鏈接:題目跳轉
總結
以上是生活随笔為你收集整理的大数高精度加减、乘除、开根(C++版全套最详细、最易懂)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 递归回溯法求数独全部解
- 下一篇: 大型颚式破碎机在石料生产线中有着怎么样的
