11076 浮點數的分數表達

2021-10-10 12:14:37 字數 1696 閱讀 9521

description

在計算機中,用float或double來儲存小數有時不能得到精確值,若要精確表達乙個浮點數的計算結果,

最好用分數來表示小數,有限小數或無限迴圈小數都可以轉化為分數,無限迴圈小數的迴圈節用括號標記出來。如:

0.9 = 9/10

0.(3) = 0.3(3) = 0.3(33) = 1/3

當然乙個小數可以用好幾種分數形式來表示,我們只感興趣最簡的分數形式(即分母最小),如:

0.3(33) = 1/3 = 3/9

因為任何乙個數都可以轉化為乙個整數和乙個純小數之和,整數部分較為簡單無需做額外處理,只要將純小數部分轉

化為分數形式,整數部分的分數部分就很簡單了。

現在給定乙個正的純小數(這個純小數為有限小數或無限迴圈小數),請你以最簡分數形式來返回這個純小數。

輸入格式

給定乙個純小數,若是無限迴圈小數,用括號標記迴圈節,輸入小數表達不超過100個字元。

說明:這裡如果覺得高精度數有難度,先考慮用64位整數來求解吧。測試資料沒有太長,位數不超過64位整數表示範圍。

即,你用64位整數做,可通過此題。

輸出格式

輸出:化為最簡分數形式,分子在前,分母在後,中間空格連線。

輸入樣例

0.3(33)

輸出樣例

1 3注意:

這題有乙個坑就是不建議各位使用pow來作為10^n。因為pow輸出以後是double型別,而double型別轉long或者轉int都會出現神秘bug,可能出現double算出來是99,轉型別以後就變成了98。

#include

#include

#include

#include

#include

#include

using

namespace std;

//求公約數函式

long

long

measure

(long

long x,

long

long y)

return z;

}int

main()

else

sstr>blong;

sstr.

clear()

;//double轉long long會有神秘bug,不要用pow!!!

long

long x=

1,y=1;

for(

int i =

0;i)for

(int i=

0;i) fenzi = along*

(x-1

)+blong;

fenmu =

(x-1)*

(y);

long

long temp =

measure

(fenzi,fenmu)

; fenzi = fenzi/temp;

fenmu = fenmu/temp;

printf

("%lld "

,fenzi)

;printf

("%lld"

,fenmu);}

//無括號,小數*10就好了

else

return0;

}

浮點數表示

之前的一些工作當中碰到了很多有關浮點數的問題,比如浮點數的表達範圍 表達精度 浮點數的儲存方式 浮點數的強制型別轉換等等,因此感覺有必要系統了解一下有關浮點數的問題。浮點數是一種公式化的表達方式,用來近似表示實數,並且可以在表達範圍和表示精度之間進行權衡 因此被稱為浮點數 浮點數通常被表示為 n m...

IEEE的浮點數表示

ieee浮點標準用v 1 s m 2 e 由符號,尾數,階碼表示 32位單精度 單精度二進位制小數,使用32位儲存。1 8 23 位長 s exp fraction 31 30 23 22 0 位編號 從右邊開始為0 偏正值 127 64位雙精度 雙精度 二進位制小數,使用64位儲存。1 11 52...

C51浮點數顯示 浮點數表示方法

c51中的浮點數儲存方式 n年前曾在c51bbs論壇中發布過 float 浮點形,它是符合ieee 754標準的單精度浮點形資料,在十進位制中具有7位有效數字。float型據占用四個位元組 32位二進位制數 在記憶體中的存放格式如下 位元組位址 由低到高 0 1 2 3 浮點數內容 mmmmmmmm...