撰寫函數 fun(a, b) 計算兩數差的絕對值,主程式呼叫 c = fun(a, b);,已知 int a, b, c;。
#include <stdio.h>
int fun(int a, int b) {
return a > b ? a - b : b - a;
}
int main() {
int a, b, c;
a = 3; b = 4; c = fun(a, b);
printf("%d 與 %d 差的絕對值: %d\n", a, b, c);
a = -3; b = -9; c = fun(a, b);
printf("%d 與 %d 差的絕對值: %d\n", a, b, c);
return 0;
}
abs (可讀性最佳)#include <stdio.h>
#include <stdlib.h> // abs() 原型
int fun(int a, int b) {
return abs(a - b);
}
注意:abs(int) 在 <stdlib.h>,labs(long)、llabs(long long)、fabs(double) (在 <math.h>)。
int fun_recursive(int a, int b) {
if (a == b) return 0;
if (a > b) return 1 + fun_recursive(a - 1, b);
return 1 + fun_recursive(a, b - 1);
}
原理:每次將較大者減 1,累加 1,直到相等。時間複雜度 O(|a-b|),**極不推薦實務使用**,僅供理解遞迴思維。
int fun_bitwise(int a, int b) {
int diff = a - b;
int mask = diff >> (sizeof(int) * 8 - 1); // 算術右移複製符號位
return (diff ^ mask) - mask; // 絕對值經典位元技巧
}
原理:mask 為全 1 (負數) 或全 0 (正數);x ^ mask 為按位取反 (負數) 或保持 (正數);減去 mask 完成 +1 (負數) 或 +0 (正數)。
| 版本 | 可讀性 | 效能 | 建議場景 |
|---|---|---|---|
| 三元運算子 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | 一般應用、教學、面試 |
| abs() | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | 生產代碼、跨平台 |
| 遞迴 | ⭐⭐ | ⭐ | 教學遞迴概念、極小差值 |
| 位元運算 | ⭐⭐ | ⭐⭐⭐⭐⭐ | 高效能計算核心、嵌入式、編譯器優化參考 |
int main() {
struct { int a, b; } tests[] = {
{10, 5}, {-3, 7}, {0, 0}, {-10, -20}, {INT_MAX, INT_MIN}
};
for (int i = 0; i < 5; i++) {
int a = tests[i].a, b = tests[i].b;
printf("|%11d - %11d| = %11d (三元) %11d (abs) %11d (位元)\n",
a, b,
a > b ? a - b : b - a,
abs(a - b),
fun_bitwise(a, b));
}
return 0;
}