日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python高精度加法_14.高精度加法

發(fā)布時間:2025/3/19 python 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python高精度加法_14.高精度加法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

作者:X3B0A1

1.0 問題

在我們熟悉的數(shù)據(jù)類型中,能夠儲存的最大的數(shù)也只是longlong的范圍。

雖然有些編譯器也提供__int128類型,但是最多也只能表示40位左右的數(shù),大小依然有限,而且適用范圍也很受限。

那么,又沒有辦法來模擬非常長的整數(shù)呢?

~~所以用python他不香么,自帶高精度還有各種庫~~

~~手動 @€€£ (doge~~

1.1 思路

既然變量不能儲存大數(shù),我們可以嘗試使用數(shù)組來儲存一個數(shù)。

用數(shù)組的每一位來儲存那個數(shù)字上的一位,也就是說,用一個長度為n的數(shù)組記錄一個n位數(shù)字。

那么,問題又來了,我們?nèi)绾芜M行加法運算呢

首先,回顧一下小學(xué)學(xué)習(xí)的豎式計算:

1 9 1

+ 9 8 1

--------

1 1 7 2

可以看到,用豎式計算時,為了保證進位正確,是從低位向高位運算的

我們可以模擬這個運算方法:

首先為了方便讀入,使用string直接讀入大數(shù)

將string類型的數(shù)轉(zhuǎn)換為數(shù)字,并為了進位方便,倒敘存儲在數(shù)組內(nèi)

len1 = str1.length();

len2 = str2.length();

//從 len - 1 開始到0遍歷數(shù)組,減去1是因為數(shù)組下標從0開始,方便操作for(int i = len1 - 1; i >= 0; i--){

//轉(zhuǎn)換為數(shù)字 num1[len1 - i] = str1[i] - '0';

}

for(int i = len2 - 1; i >= 0; i--){

num2[len2 - i] = str2[i] - '0';

}

遍歷數(shù)組,對于每一組數(shù),先兩個數(shù)加起來:

sum[i] += num1[i] + num2[i];

然后把兩數(shù)的和對10取整,即進位。

例如,兩數(shù)的和為9,對10取整為0,即進位為0; 兩數(shù)的和為19,對10取整為1,即進1位。

sum[i + 1] = sum[i] / 10;

處理完進位后,把兩數(shù)的和對10取余,留下個位。

例如,和為9,對10取余,留下個位為9;和為19,對10取余,留下個位為9。

sum[i] %= 10;

最后將數(shù)組倒敘輸出即可。

1.2 完整代碼

根據(jù)上面的描述,可以得到如下代碼:

#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;

//轉(zhuǎn)換 len1 = str1.length();

len2 = str2.length();

//從 len - 1 開始到0遍歷數(shù)組,減去1是因為數(shù)組下標從0開始,方便操作 for(int i = len1 - 1; i >= 0; i--){

//倒敘存儲 把字符轉(zhuǎn)換為數(shù)字 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;

}

//輸出 //進位有可能導(dǎo)致位數(shù)增加1 if(sum[len + 1]){

len++;

}

//倒敘輸出 for(int i = len; i >0; i--){

cout << sum[i];

}

return 0;

}

1.3 時間復(fù)雜度分析

該算法次數(shù)最多的循環(huán)為最大數(shù)的數(shù)位次,時間復(fù)雜度即為

總結(jié)

以上是生活随笔為你收集整理的python高精度加法_14.高精度加法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。