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; }