貪心-埃及分數

問題描述

把一個真分數表示爲埃及分數之和的形式。所謂埃及分數,是指分子爲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。這樣很容易找到最大的分數的分母。

算法設計

  1. 設某個真分數的分子爲A(!=1),分母爲B。
  2. 把B除以A的商的整數部分加1後的值作爲埃及分數的分母 C。
  3. 輸出 1/C。
  4. 將A乘以C減去B作爲新的A。
  5. 將B乘以C作爲新的B
  6. 如果A大於1且能整除B,則最後一個埃及分數的分母爲B/A.
  7. 如果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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章