python高精度加法_14.高精度加法
作者:X3B0A1
1.0 問題
在我們熟悉的數據類型中,能夠儲存的最大的數也只是longlong的范圍。
雖然有些編譯器也提供__int128類型,但是最多也只能表示40位左右的數,大小依然有限,而且適用范圍也很受限。
那么,又沒有辦法來模擬非常長的整數呢?
~~所以用python他不香么,自帶高精度還有各種庫~~
~~手動 @€€£ (doge~~
1.1 思路
既然變量不能儲存大數,我們可以嘗試使用數組來儲存一個數。
用數組的每一位來儲存那個數字上的一位,也就是說,用一個長度為n的數組記錄一個n位數字。
那么,問題又來了,我們如何進行加法運算呢
首先,回顧一下小學學習的豎式計算:
1 9 1
+ 9 8 1
--------
1 1 7 2
可以看到,用豎式計算時,為了保證進位正確,是從低位向高位運算的
我們可以模擬這個運算方法:
首先為了方便讀入,使用string直接讀入大數
將string類型的數轉換為數字,并為了進位方便,倒敘存儲在數組內
len1 = str1.length();
len2 = str2.length();
//從 len - 1 開始到0遍歷數組,減去1是因為數組下標從0開始,方便操作for(int i = len1 - 1; i >= 0; i--){
//轉換為數字 num1[len1 - i] = str1[i] - '0';
}
for(int i = len2 - 1; i >= 0; i--){
num2[len2 - i] = str2[i] - '0';
}
遍歷數組,對于每一組數,先兩個數加起來:
sum[i] += num1[i] + num2[i];
然后把兩數的和對10取整,即進位。
例如,兩數的和為9,對10取整為0,即進位為0; 兩數的和為19,對10取整為1,即進1位。
sum[i + 1] = sum[i] / 10;
處理完進位后,把兩數的和對10取余,留下個位。
例如,和為9,對10取余,留下個位為9;和為19,對10取余,留下個位為9。
sum[i] %= 10;
最后將數組倒敘輸出即可。
1.2 完整代碼
根據上面的描述,可以得到如下代碼:
#include#include#include
using namespace std;
const int MAXn = 2333;
int num1[MAXn], num2[MAXn], sum[MAXn];
int len1, len2;
int main(){
//讀入 string str1, str2;
cin >> str1 >> str2;
//轉換 len1 = str1.length();
len2 = str2.length();
//從 len - 1 開始到0遍歷數組,減去1是因為數組下標從0開始,方便操作 for(int i = len1 - 1; i >= 0; i--){
//倒敘存儲 把字符轉換為數字 num1[len1 - i] = str1[i] - '0';
}
for(int i = len2 - 1; i >= 0; i--){
num2[len2 - i] = str2[i] - '0';
}
//進行加運算 int len = max(len1, len2);
for(int i = 0; i <= len; i++){
//此處使用“+=” 是因為可能有進位 sum[i] += num1[i] + num2[i];
//處理進位 直接把進的為賦值給sum[i - 1] sum[i + 1] = sum[i] / 10;
//保留個位 sum[i] %= 10;
}
//輸出 //進位有可能導致位數增加1 if(sum[len + 1]){
len++;
}
//倒敘輸出 for(int i = len; i >0; i--){
cout << sum[i];
}
return 0;
}
1.3 時間復雜度分析
該算法次數最多的循環為最大數的數位次,時間復雜度即為
總結
以上是生活随笔為你收集整理的python高精度加法_14.高精度加法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 好想学python机器人_【Python
- 下一篇: 基于ssm的用户管理系统_基于SSM的高