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...