程式設計之美 2 6 精確表達浮點數

2021-08-20 11:39:20 字數 1906 閱讀 8785

/**

* 本題目內容如下:

* 在計算機中,有時使用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...