這個演算法的根本原理是:乙個分數對應一條直線的斜率。用數學語言描述就是:一條直線的斜率是無窮大(垂直於x軸)或者是(y2-y1) / (x2-x1),我們要做的就是找到2個整數,在指定的精度範圍內接近這個斜率。對於正數來說,我們設定分子為0,分母為1,然後比較這個分數同給定的十進位制數。如果我們的分數太小了(比如,我們選擇的點在直線的下面),我們就加大分子的值直到這個分數太大(比如,這個點在直線的上方),之後我們在增加分母的大小直到這個點在直線下方。如果我們的最終目標是無理數(無限不迴圈小數),這個演算法將一直繼續,增加分子和分母,直到最終結果在指定的精度上。12
3456
78910
1112
1314
1516
1718
1920
2122
2324
2526
2728
2930
3132
3334
3536
3738
3940
4142
4344
4546
4748
4950
5152
53#include
#include
#include
int
main()
if
(
abs
(idecimal) >= 1)
//如果輸入大於等於1,則分解為整數部分和小數部分
daccuracy = 0.0001;
//設定精度
inumerator = 0;
//初始分子
idenominator = 1;
//初始分母
inegative = 1;
//負數標誌
if
(idecimal <0)
inegative = -1;
dfraction = 0;
while
(
fabs
(dfraction - ddecimal) > daccuracy)
//判斷精度是否達到要求
if
(
abs
(idecimal) >= 1)
cout << dinteger <<
'+'
<<
'('
<< inumerator <<
'/'
<< idenominator <<
')'
<< endl;
else
cout << inumerator <<
'/'
<
return
0;
}
小數化分數(C )
問題描述 任何小數都能表示成分數的形式,對於給定的小數,編寫程式其化為最簡分數輸出,小數包括簡單小數和迴圈小數。輸入形式 第一行是乙個整數n,表示有多少組資料。每組資料只有乙個純小數,也就是整數部分為0。小數的位數不超過9位,迴圈部分用 括起來。輸出形式 對每乙個對應的小數化成最簡分數後輸出,佔一行...
hdu 1717 小數化分數2
0.325656 9900 3256.5656 32.5656 0.325656 9900 3256 32 所以,0.325656 3224 9900 將純迴圈小數改寫成分數,分子是乙個迴圈節的數字組成的數 分母各位數字都是9,9的個數與迴圈節中的數字的個數相同.將混迴圈小數改寫成分數,分子是不迴圈...
無限迴圈小數化分數
迴圈小數分為混迴圈小數 純迴圈小數兩大類。混迴圈小數可以 10 n n為小數點後非迴圈位數 所以迴圈小數化為分數都可以最終通過純迴圈小數來轉化。無限迴圈小數,先找其迴圈節 即迴圈的那幾位數字 然後將其展開為一等比數列 求出前n項和 取極限 化簡。例如 0.333333 迴圈節為3 則0.33333....