匯東網


C 程序設計 - 埃及分數

[編輯] [转简体]
|
作者:huidong | 分類:【編程】C 程序設計課程
[ 9 瀏覽 0 評論 4 贊 3 踩 ]

概要
貪心算法典例,將一個真分數表示成若干個埃及分數(分子爲一的分數)之和。

正文

自己寫的的代碼

#include <stdio.h>
#include <stdlib.h>
#define int_abs(a) ((a) > 0 ? (a) : -(a))

// 後面沒用上了
int gcd(int m, int n)
{
    if (!m || !n)
        return 1;

    // 準備輾轉相除,首先使 a >= b,r 記錄餘數
    int a = m, b = n, r = 0;
    if (a < b)
        a ^= b ^= a ^= b;
    do
    {
        r = a % b;
        a = b;
        b = r;
    } while (r != 0);

    return a;
}

// 真分數 a/b 轉化爲埃及分數表示(貪心算法)
// 返回使用了多少項進行表示
// 若返回 0 表示輸入不是真分數
// 若返回 -1 表示所給數組不足以存儲所有的項
int CalcEgyptianFraction(int _A, int _B, int _pArr[], int _Size)
{
    int a = int_abs(_A), b = int_abs(_B);
    int sig = _A * _B > 0 ? 1 : -1;    // 符號位
    int index = 0;

    if (a >= b)
        return 0;

    for (int i = 0; index < _Size; i++)
    {
        // 計算相減結果
        int a2 = a * i - b;
        int b2 = b * i;
        if (a2 >= 0)
        {
            _pArr[index++] = i * sig;

            // 上下約分再存儲,防止數值越界(後來發現很影響速度)
            //int common_factor = gcd(a2, b2);
            //a = a2 / common_factor;
            //b = b2 / common_factor;
            a = a2;
            b = b2;

            // 完成表示
            if (a2 == 0)
                break;
        }
    }

    if (index == _Size)
        return -1;
    else
        return index;
}

// 展示埃及分數
void display(int a, int b, int arr[], int size)
{
    printf("%d/%d = ", a, b);
    for (int i = 0; i < size && arr[i]; i++)
        printf("%s1/%d", i > 0 ? " + " : "", arr[i]);
}

int main()
{
    int arr[1024] = { 0 };
    int a, b;

    printf("本程序可以使用埃及分數表達真分數,請輸入一個真分數(例如 2/3):\n");
    scanf_s("%d/%d", &a, &b);
    int ret = CalcEgyptianFraction(a, b, arr, sizeof(arr));

    if (ret == -1)
        printf("這個分數需要多於 %llu 個埃及分數表達,放棄計算。\n", sizeof(arr));
    else if (ret == 0)
        printf("不是真分數。\n");
    else
        display(a, b, arr, sizeof(arr));

    return 0;
}


[ 4] [ 3]


 評論區  0 條評論

+ 添加評論