基礎 (C語言)高精度演算法

2021-10-12 02:37:30 字數 3201 閱讀 5346

三、總結

多數時候我們需要進行非常龐大的數字運算,其中涉及四則運算,加減乘除,但是當連最大的long long型別也容納不下如此大的數字的時候,我們應該怎麼辦?

那麼,我們就要用到今天所介紹的高精度演算法,顧名思義,我們可以用一些特殊的方式來得出我們想要計算的答案。

在講高精度演算法之前,我們需要引入陣列和字串這兩位我們在學習過程中的老朋友。

第一:我們知道,陣列的優點是可以儲存大量數字,並且每一位都是數的形式,運算時非常方便,但是陣列在輸入的時候必須要有分隔符,不符合數字的輸入習慣。

第二:我們知道,字串在輸入的時候是連續的,不需要分隔符,非常符合數字的輸入習慣,但是不能直接進行運算,非常不方便。

所以,我們可以就其兩者取長補短,用陣列來進行運算和儲存資料,用字串來輸入資料!

通過字串引入兩串數字分別存放到兩個字元陣列

將其每一位數字逆序分別存放到兩個整型陣列

進行計算並處理進製(關鍵)

將結果存放到第三個整型陣列當中(引進動態陣列)

輸出結果

第一:我們引進兩串數字

char num1[

102]

;char num2[

102]

;scanf

("%s"

, num1)

;scanf

("%s"

, num2)

;

第二:將每一位數字逆序存放整型陣列

int la,lb,lc;

int a[

2001]=

;int b[

2001]=

;int c[

2001]=

;//這是待會兒要存答案的陣列

la=strlen

(num1)

;//取第乙個字串的長度

lb=strlen

(num2)

;//取第二個字串的長度

for(

int i=

0;i)for

(int i=

0;i) lc=la+lb;

//記錄兩個字串的總長度

第三:進行計算並處理進製

for

(int i=

0;i)}

想必大家不知道這演算法公式是怎樣推導出來的吧,那就讓我針對推導過程進行講解吧!

第四:將結果存放到第三個整型陣列當中(引進動態陣列)

while

(c[lc]==0

&&lc>

0)lc--

;char

*re=

(char*)

malloc

(sizeof

(char)*

(lc+2)

);for(

int i=lc;i>=

0;i--

) re[lc+1]=0;

4.1

沒錯,這裡又出現了乙個特別的while語句

while(c[lc]==0&&lc>0)lc–

它的作用是:比較大眾的說法是刪去前導零,不過這裡有個小插曲,就是筆者在閱讀其他作者的文章的時候並不能理解前導零是怎麼產生的(沒錯就是這麼傻 ),所以在這裡我有另一種較為容易理解的說法。

還記得我們前面定義了兩個字串的長度和lc嗎?

想想我們有兩種情況:

1.在最高位有進製,那麼這是存答案的陣列就會往前再儲存一位數字,存在c【lc】中(想想為什麼)

2.在最高位沒有進製,那麼我們在初始化的時候就已經把c【lc】置為0了,那麼我們就要將總長度lc(總位數)減掉,避免輸出的時候在答案前面多了個0

4.2

這裡我們引入動態陣列的原因是筆者是用函式寫的這部分運算,因此在函式結束時,函式會銷毀,導致我們不能正常輸出結果,因此需要另外開乙個動態陣列來存放我們的結果。

4.3:

有沒有注意到re[lc+1]=0,它可是至關重要的一步

筆者因為漏了它導致作業一直沒能滿分,因為記憶體的問題qaq

它能夠讓我們在輸出結果的時候及時地終止程式的讀取,為什麼呢?因為字串在輸出的時候只有讀取到』\0』的時候才會終止,那麼我們加上這句之後就是要讓它在答案結尾處就終止輸出,能避免不斷輸出而引起的記憶體出錯哦!

第五:輸出

沒啥好講的其實hhhhh

**如下:

#include

#include

#include

char

*multiply

(char

* num1,

char

* num2)

;int b[

2001]=

;int c[

2001]=

; la=

strlen

(num1)

; lb=

strlen

(num2)

;for

(int i=

0;i)for

(int i=

0;i) lc=la+lb;

for(

int i=

0;iwhile

(c[lc]==0

&&lc>

0)lc--

;char

*re=

(char*)

malloc

(sizeof

(char)*

(lc+2)

);for(

int i=lc;i>=

0;i--

) re[lc+1]

=0;return re;

}int

main()

C語言 高精度演算法

筆者去年總結了pascal裡有關高精度計算的問題,首先高精度計算可以解決以下四個問題 1.加數,減數,運算結果的輸入和儲存 運算因子超出了整型 實型能表示的範圍,肯定不能直接用乙個數的形式來表示。在pascal中,能表示多個數的資料型別有兩種 陣列和字串。陣列 每個陣列元素儲存1位 在優化時,這裡是...

基礎演算法 高精度計算 高精度加法

輸入兩個數到兩個變數中,然後用賦值語句求他們的和,輸出。但是,我們知道,在c 中任何資料型別都有一定表示範圍。當兩個被加數很大時,上述演算法顯然不能求出精確解,因此尋求另外一種方法。在讀小學時,我們做加法都採用豎式方法,這樣,我們可以寫出兩個整數相加的演算法。我們用陣列a b分別儲存加數和被加數,用...

基礎演算法 高精度減法

從低位開始ab對位相減,如果不夠減則向前借1。用t來儲存借位狀態,即 a b t t 10 10 包含了兩種情況 1 如果a i b i 0,則 10取餘數還是個位數。2 a i b i 0則要借位 10然後取餘10,還是回得到個位的數 去掉前導00 給定兩個正整數,計算它們的差,計算結果可能為負數...