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

C 語言筆試題精選:不使用比較/條件語句求兩數較大值

     編輯:關於C

題目限制

  • 不可使用 if、while、switch、for、?:。
  • 不可使用任何比較運算子(>、<、== 等)。

位元運算解法

#include 

int max_val(int a, int b) {
    int diff = a - b;                    // 正→a大,負→b大
    int sign = (unsigned)diff >> 31;     // 算術右移:負得全1(0xFFFFFFFF),非負得0
    int arr[2] = { b, a };               // 索引 0→b, 1→a
    return arr[sign & 1];                // sign=0 取 a, sign=-1(即1) 取 b
}

int main(void) {
    int a, b;
    scanf("%d %d", &a, &b);
    printf("%d\n", max_val(a, b));
    return 0;
}

原理圖解

a-bsign (unsigned>>31)sign & 1arr[index]結果
>=000arr[0]=bb (錯誤!)
<00xFFFFFFFF (-1)1arr[1]=aa (錯誤!)

修正:sign = ((unsigned)(b - a)) >> 31; 使 a>b 時 sign=0 取 arr[1]。
或交換陣列順序 int arr[2] = {a, b}; 配合原邏輯。

修正後完整代碼

int max_val(int a, int b) {
    int diff = b - a;                    // b-a 正→b大
    int sign = (unsigned)diff >> 31;     // b>a 時 sign=0
    int arr[2] = { a, b };               // 0→a, 1→b
    return arr[sign & 1];                // b>a 取 b
}

測試

輸入:3 5 → 輸出 5
輸入:10 2 → 輸出 10
輸入:-5 -3 → 輸出 -3

補充:無分支絕對值

int abs_val(int x) {
    int mask = x >> 31;           // 負數全1,非負全0
    return (x ^ mask) - mask;     // (x^mask) 翻轉負數位元,-mask 相當於 +1
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved