原始錯誤程式碼
int f(int a, int b) {
int temp;
if (a > b) { temp = a, a = b, b = temp; } // 逗號運算子誤用
while (a != 0)
do { temp = a, a = b % a, b = temp; } // while 不需 do
return b;
}
問題分析
- 逗號運算子濫用:
temp=a, a=b, b=temp 雖語法合法,但可讀性極差,易導致邏輯錯誤。
- 多餘的
do-while:外層已有 while(a!=0),內層 do 導致結構混亂,實際僅需單層迴圈。
- 缺少大括號:單行陳述式建議加上大括號,避免維護時誤判。
修正後標準輾轉相除法
int gcd(int a, int b) {
int temp;
if (a > b) {
temp = a;
a = b;
b = temp;
}
while (a != 0) {
temp = a;
a = b % a;
b = temp;
}
return b;
}
更簡潔寫法(遞迴版)
int gcd_recursive(int a, int b) {
return (b == 0) ? a : gcd_recursive(b, a % b);
}
測試範例
int main() {
printf("%d\n", gcd(48, 18)); // 6
printf("%d\n", gcd_recursive(48, 18)); // 6
return 0;
}
總結
- 避免在流程控制中濫用逗號運算子,改用區塊
{} 明確分隔陳述式。
- 輾轉相除法核心邏輯:
while (a) { int r = b % a; b = a; a = r; },最後 b 即為 GCD。
- 遞迴版程式碼極短,但需注意堆疊深度(對 32 位整數極安全)。