/**
* 本題目內容如下:
* 在計算機中,有時使用float或double來儲存小數是不能得到精確值的. 如果你需要得到精確計算結果,最好是用分數形式來表示小數。有限小數或者無限迴圈小數都可以轉化為分數。
* eg:
0.9 = 9/10;
*0.33(3) = 1/3(括號裡的數字表示的的是迴圈節)
* 當然乙個小數可以用好幾種弄分數形式來表示. 如:
* 0.33(3) = 1 / 3 = 3 / 9;
* 給定乙個有限小數或無限迴圈小數, 你能否異分母最小的分數形式來返回這個小數呢?
* 如果輸入為迴圈小數, 迴圈節用括號標記出來.
*//**
* 在此處假定, 輸入的數字以回車為結束. 由於輸入中帶有括號, 所以可以把數字看成是字串, 以字元的形式讀入.
* 新建立乙個結構體用於表示分數, 結構體字段有兩個即可: 乙個分子, 乙個分母;
* 如此一來, 對於有限小數, 本題便轉換成了求兩個數字的最小公約數了.
* 對於無限迴圈小數, 本題相對來說複雜一些, 需要尋求一種方法來計算出其迴圈節部分對應的分數形式
*/#include
#include
struct fraction ;
int power(int base, int power)
int ctoi(char ch, int length)
return target;
}int substract(int x, int y) else
while(max - min != 0)
}return min;
}// 此函式中用於轉化有限小數, 首先將小數部分轉化為整數, 然後求小數部分與10^ld的最大公約數, 上下約分, 得到分數形式
struct fraction limiteddecimals(char integer, int li, char decimal, int ld)
// 此函式中用於轉化無限迴圈小數
// integer為整數部分, decimal為小數不迴圈部分, cycle為迴圈節
// 將迴圈節部分轉換成小數之後, 由於其位於小數點右側ld位處, 因此需要除以10^ld, 再加上decimal轉換成的分數部分, 然後再加上整數部分即可.
// 迴圈節轉換演算法:
// y = 0.(c1c2…cm)
// y * 10^m = (c1c2…cm).c1c2…cm = c1c2…cm + 0.(c1c2…cm)
// y * 10^m - y = c1c2…cm
// 所以, y = c1c2…cm / (10^m - 1)
struct fraction infiniteloopdecimal(char integer, int li, char decimal, int ld, char cycle, int lc)
int main()
integer[li] = '\0';
if (ch == '\n')
while ((ch = getchar()) != '(' && ch != '\n')
decimal[ld] = '\0';
if (ch == '(')
cycle[lc] = '\0';
}while (ch != '\n')
ch = getchar();
if (lc == 0)
printf("這是個無限迴圈小數: ");
frac = infiniteloopdecimal(integer, li, decimal, ld, cycle, lc);
printf("%d/%d\n", frac.numerator, frac.denominator);
}return 0;
}
程式設計之美 2 6 精確表達浮點數
題目 給乙個有限小數 或者 無限迴圈小數,用分母最小的方式用分數精確的表達這個數字。括號中表示迴圈部分,如 0.3 0.3 3 0.3 0 思路 我一看,傻眼了,想了兩下不想想了,就在網上找迴圈小數轉分數,結果居然是小學奧賽題!我鬱悶的很啊.拿 1.2 34 來舉例子吧 1.2 34 10 12.3...
程式設計之美 2 6 精確表達浮點數
1.簡述 簡單的說就是將有限迴圈小數和無限迴圈小數轉化為分數形式。比如 0.9 9 10 0.333 3 1 3,其中括號表示迴圈節。2.思路 書上的方法就是分情況討論。首先是有限迴圈小數,比如123.456,整數部分123不用說了,主要是小數部分0.456,直接轉化為456 1000,然後消去最大...
程式設計之美 2 6 精確表達浮點數
題目 給乙個有限小數 或者 無限迴圈小數,用分母最小的方式用分數精確的表達這個數字。括號中表示迴圈部分,如 0.3 0.3 3 0.3 0 思路 我一看,傻眼了,想了兩下不想想了,就在網上找迴圈小數轉分數,結果居然是小學奧賽題!我鬱悶的很啊.拿 1.2 34 來舉例子吧 1.2 34 10 12.3...