兩個整數求平均值很簡單?沒幾個人寫對這個代碼!

譚浩強C程序設計(第五版)課後答案-視頻講解:求2個整數的平均值

這個題目很多時候是直接求2個整數的平均值。
那這個題目就很簡單了,請看如下代碼:

//代碼1
#include <stdio.h>

int main()
{
    int a = 0;
    int b = 0;
    scanf("%d%d", &a, &b);
    int average = (a + b) / 2;
    printf("avg = %d\n", average);

    return 0;
}

這個是一般的實現方式,請看測試結果:
測試結果1:
在這裏插入圖片描述
測試結果2:
在這裏插入圖片描述
測試結果1是正確的,但是測試結果2是錯誤的。
這裏我們發現,代碼1還是有一定的問題的!

問題就是:如果求平均數的兩個數比較大,如果他們的和超過了整形能表示的最大值,這樣就產生了溢出,溢出之後得到的結果也就不是和,不是和就不能求得平均值。

那麼此時如果在面試,面試官就會追問,那怎麼解決呢?
這裏請看一張圖:
在這裏插入圖片描述

看完這張圖,我們應該就能明白了,原來代碼可以這樣寫:

#include <stdio.h>
#include <limits.h>

int main()
{
    int a = 0;
    int b = 0;
    scanf("%d%d", &a, &b);
    int average = a + (b - a) / 2;
    printf("avg = %d\n", average);

    return 0;
}

看測試結果:
在這裏插入圖片描述
看,問題解決了,這就好多了。

升級班

如果面試官這個時候,我們這裏不能使用除2的方式呢,代碼改怎麼改進呢?
其實也不要害怕,我們現在給出代碼的2種實現。
實現1:

#include <stdio.h>
#include <limits.h>

int main()
{
    int a = 0;
    int b = 0;
    scanf("%d%d", &a, &b);
    //右移一位有除2的效果
    int average = a + ((b - a) >> 1);
    printf("avg = %d\n", average);

    return 0;
}

實現2:

#include <stdio.h>
#include <limits.h>

int main()
{
    int a = 0;
    int b = 0;
    scanf("%d%d", &a, &b);
    int average = a&b + ((a^b) >> 1);
    printf("avg = %d\n", average);
    return 0;
}

以上2種實現,不是很明白,這裏我錄製了一個視頻,請參考:

點擊播放視頻

好了,這篇文章就講解到這裏,沒有提到的,咱們評論區見!

下一篇:【白嫖】IT筆試面試真題講解系列文章+視頻-持續更新中
更多學習資料領取:學習資料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章