切換
舊版
前往
大廳
主題

ZeroJudge - d427: 大數根號 解題心得

Not In My Back Yard | 2018-08-13 11:30:34 | 巴幣 2 | 人氣 1323

題目連結:

題目大意:
給定一個正整數N(介於1~2 ^ 32-1之間的值),求其平方根的值(精確到小數點後50位)。

解題思維:
可以運用「直式開方法」:
將數字從個位數兩兩分開,再運用平方和公式(a+b)^ 2 = a ^ 2+2ab+b ^ 2,推出(a+b) ^ 2-a ^ 2 = 2ab+b ^ 2 = b(2ab+b),這便可以用在求平方根,詳情可以參見這裡

但是因為運算的中途可能出現整數型態裝不下的情況,所以要自己寫一個大數型態(Java和Python之類就不用擔心,有內建的大數型態)。

大數乘法可以參見 c666

至於減法跟加法同質,所以想辦法定義加法就好。正整數+正整數的進位處理跟乘法一樣,比較麻煩的是有正整數+負整數的時候。

第一種情況是正整數的絕對值 = 負整數的絕對值(例:10+(-10)),沒什麼好說的,即為0。

第二種情況是正整數的絕對值 > 負整數的絕對值(例:10+(-9)),就跟正整數+正整數一樣,陣列儲存的值直接去互減就好。一旦遇到某個陣列的值 < 0,便從下一位借位。因為正的絕對值 > 負的絕對值,所以保證結果為正。

第三種情況是正整數的絕對值 < 負整數的絕對值(例10+(-11)),不要硬幹,我們的結果可以寫作,以上面為例,-(11+(-10)),因為我們已經實作了第二種情況了,於是也解決了。

因為方便的關係,我直接寫了一個大數的類別(Class),並定義了加減乘(+、-、*)的運算子。甚至還寫了輸出、輸入(<<、>>,至少在C++是這樣)的運算子,雖然本題根本用不到XD。


此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大們可以提出來討論。

創作回應

更多創作