首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言函數練習:計算兩數差的絕對值 (遞迴/迭代/三元運算子)

     編輯:C 語言問答

C 語言函數設計:兩數差的絕對值多種實作

題目

撰寫函數 fun(a, b) 計算兩數差的絕對值,主程式呼叫 c = fun(a, b);,已知 int a, b, c;。

解法 1:三元運算子 (最簡潔)

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

解法 2:標準庫 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>)。

解法 3:遞迴版本 (教學示範,非實務)

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|),**極不推薦實務使用**,僅供理解遞迴思維。

解法 4:位元運算 (無分支,效能極致)

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;
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved