演算法之詳解高精度加法 演算法筆記

2021-10-19 18:56:39 字數 1802 閱讀 1948

(我已經把csdn當作筆記本了~…,這裡語言會淺顯一點不想搞得很高階的樣子)

高精度是各類資訊競賽中的必會型別,高精度一般就是整數字太長,小數字太大,程式很難直接運算或表達。

直接進入正題,不磨蹭,將問題分析一點點解決。

q1:為什麼需要高精度

c語言現有的型別無法儲存,上圖,看一眼即可

q2:如何實現加法,通過什麼實現

小學我們學過,加減乘除,對於每一位,滿十進1,不滿十直接相加即可。對於高精度的加法,採用的也是這個原理,我們可以通過陣列來儲存每一位,用陣列來模擬加法,這樣可以實現很大位的加法運算,下圖就是原理。

我們可以通過三個陣列來實現,第一二個儲存加數,第三個儲存結果。

首先我們要解決難點:

q3:如何儲存陣列-------將每一位陣列倒序儲存到陣列內,為什麼倒序/

a3:還是看上圖,個位和個位是對齊的,方便計算,假如我們第一位放最大位數,那麼假如兩個數最大個數不同,加法算式就會出現下面情況

1234 ·············· ---- 1234 ················· --------4321(倒序)

45···················---- 0045 ··················--------54

這樣加不對········這樣也可以·····················雖然這樣我們看著不方便,但是程式方便

q4:如何錄入

a4:如果真的是單純的錄入數字,而採取錄入到陣列的話,錄入的時候會遇到個問題,每位儲存乙個數字意味著每輸入一位數字,就要按空格或者換行,否則用scanf會導致多個數字粘連起來。所以使用字元陣列很方便,然後讓字元陣列每一位減去』0』即可。

核心**:

//我們陣列第一位不儲存數,所以從i=1開始

for(itn i=

1;i<=

max(a,b)+1

;i++

)

全部**:

#include

#include

#include

using namespace std;

intmain()

,b[505]=

,c[505]=

;//注意這裡要賦值為0,不然可能出錯

int la,lb,lc;

scanf

("%s"

,s1)

;scanf

("%s"

,s2)

; la=

strlen

(s1)

; lb=

strlen

(s2)

;for

(int i=

0;i)//在這裡,陣列第0位被跳過了

a[la-i]

=s1[i]

-'0'

;for

(int i=

0;i) b[lb-i]

=s2[i]

-'0';

lc=max(la,lb)+1

;for

(int i=

1;i<=lc;i++)if

(c[lc]==0

&& lc>

0)lc--

;for

(int i=lc;i>

0;i--

)printf

("%d"

,c[i]);

return0;

}

這麼辛苦點個?吧

高精度演算法 791 高精度加法

給定兩個正整數,計算它們的和。輸入格式 共兩行,每行包含乙個整數。輸出格式 共一行,包含所求的和。資料範圍 1 整數長度 100000 輸入樣例 1223 輸出樣例 35注意點 1.兩個整數較大,用字串來存,這樣的話,可以呼叫它的size 方法 2.將兩個大的整數,存入vector陣列中,最好把整數...

高精度演算法之加法減法

高精度加法是高精度演算法裡面最容易思考的乙個 其實現過程並不難 注意的地方應該是進製的問題 思路 我們可以設兩個陣列a 10090 b 10090 這兩個陣列的作用是用來儲存高精度數的數字 string型別字串str1,str2 用來輸入資料 然後貼 include include include ...

高精度數演算法 加法

基本資料型別 長度有限。所以大的資料被單獨拿出來。高精度演算法就是模擬我們在紙上的運算。要死要死要死 我忘記了。乙個空間有剩餘的int後面是自帶補0的啊。還有平時沒有注意到的三目運算子 length str1 str2 str1 str2 上 include include define max 1...