重新開始戰鬥11 程式設計之美 精確表達浮點數

2021-06-21 05:12:37 字數 775 閱讀 1808

問題描述:

給定乙個有限小數或無限迴圈小數,能否以分母最小的分數形式來返回這個小數。

問題分析:

在進行分析之前,先談談對這個題的思考方式。如何表示乙個有限小數或無限迴圈小數,首先,無限迴圈小數的表達一定比有限小數更加複雜,所以應該從有限小數入手。其次,用分母最小的分數形式表示,如果沒有這個限制條件,那麼問題的求解也應該會變得簡單。因此在解決這個問題的時候,應該從簡到難。

對於有限小數:x=0.a1a2a3..an,在不考慮分母最小的情況下,其分數的表示很簡單!即,如果要用分母最小的形式表示,則求10n和a1a2a3..an最大公約數問題。

對於無限迴圈小數:x=0.a1a2a3..an(b1b2b3..bm),其中括號內為迴圈部分,關於無限迴圈小數存在非迴圈節與迴圈節的問題,如果乘以10n,則可以將問題轉為只含迴圈節的無限迴圈小數的問題上,這樣又可以進一步簡化問題。

那麼對於x=0.a1a2a3..an( b1b2b3..bm),10nx=a1a2a3..an +0.( b1b2b3..bm);對於y=0.( b1b2b3..am),

10my = 0.( b1b2b3..bm)+b1b2b3..bm,進而,10my-y=b1b2b3..bm,所以y= b1b2b3..bm/(10m-1)。帶入得:

x=( a1a2a3..an+y)/10n

=( a1a2a3..an+ b1b2b3..bm/(10m-1))/10n

=( a1a2a3..an*(10m-1)+(b1b2b3..bm))/((10m-1)*10n)

得到問題的解,然後退化為最大公約數問題。

重新開始戰鬥03 程式設計之美 買書問題

問題描述 由於 哈利波特 系列相當暢銷,店長決定通過 活動來回饋讀者。上櫃的 哈利波特 瓶裝本系列中,一共有5卷。假設每一捲單獨銷售均需8歐元。如果讀者一次購買不同的兩卷,就可以扣除5 的費用,三卷更多。具體的折扣如下 本數 折扣 2 5 3 10 4 20 5 25 每本書只能享受一種折扣。例如買...

重新開始戰鬥05 程式設計之美 光影切割

問題描述 假設有乙個矩形區域,有若干條直線切割該區域,並且沒有一條直線與y軸平行,且不存在三條 以及3條以上 切割線相交於一點的情況。請問該矩形平面被分割成多少塊。分析 假設一塊矩形區域已經被切割成很多塊,那麼此時再增加一條切割線,新的切割線與其他切割線相交,且有m個交點。那麼新的切割線被分割成m ...

重新開始戰鬥04 程式設計之美 尋找ID問題

問題描述 乙個很大的列表 有10億多個數 這個列表中全是都是id號,正常狀態下每個id都會再列表中出現兩次 都是亂序 1.當有乙個id號丟失時,如何找到這個id號 2.當有兩個id號丟失時,如何找到這兩個id號。解法一 最直觀 申請乙個陣列,這個陣列和id列表一樣大,然後遍歷id列表,每遍歷乙個id...