譚浩強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筆試面試真題講解系列文章+視頻-持續更新中
更多學習資料領取:學習資料