問題描述
把一個真分數表示爲埃及分數之和的形式。所謂埃及分數,是指分子爲1的分數。如7/8 = 1/2 + 1/3 + 1/24。
問題分析
一個真分數a/b,要尋找其最大的1/c,那麼很容易想到的方法是枚舉。但是枚舉法效率不高,所以這裏採用貪心算法。
a/b肯定爲<1的數字,那麼 c = b / a 既可以理解爲b比a大多少倍,那麼顯然餘數不爲0 時c = b / a + 1。這樣很容易找到最大的分數的分母。
算法設計
- 設某個真分數的分子爲A(!=1),分母爲B。
- 把B除以A的商的整數部分加1後的值作爲埃及分數的分母 C。
- 輸出 1/C。
- 將A乘以C減去B作爲新的A。
- 將B乘以C作爲新的B
- 如果A大於1且能整除B,則最後一個埃及分數的分母爲B/A.
- 如果A=1,則最後一個分母爲B;否則跳轉到2步驟
代碼實現
#include <stdio.h>
int main() {
int a, b, c; //a爲分子,b爲分母
printf("請輸入分子:");
scanf("%d", &a);
printf("請輸入分母:");
scanf("%d", &b);
//如果是假分數,則出錯
if (a >= b) {
printf("輸入錯誤!\n");
return -1;
}
printf("%d/%d=",a,b);
//分子爲1或者分數可以約分
if (a == 1 || b % a == 0){
printf("1/%d", b / a);
return 0;
}
while (a != 1) {
c = b / a + 1; //計算出分母
a = a * c - b;
b = b * c;
printf("1/%d",c);
if (a > 1){
printf(" + ");
}
if (b%a == 0 || a == 1){
printf("1/%d",b/a);
a = 1;
}
}
return 0;
}