求平均數的三種方法

第一種:常規法
先求兩個數之和,再除以二(或者右移一位)。

int a,b,c=0;
scanf("%d%d",&a,&b);
c=(a+b)/2;//c=(a+b)>>1;
printf("%d",c);

但是這種方法有可能會導致數據溢出。那麼我們又會想到,將兩個數分別右移一位再相加,這對於偶數是可行的,但是如果兩個數都是奇數會導致錯誤,需要在 奇數的結果後面再加一個1,可以通過分情況來解決。

int a,b,c=0;
scanf("%d%d",&a,&b);
if(a%2==1&&b%2==1)
{
       c=a>>1+b>>1+1;
}
else
{
       c=a>>1+b>>1;
}

這樣未免有點繁瑣,求個平均數還興師動衆的。
第二種:求差法
我們可以通過圖片來理解:從圖中我們能看到,a和b相差的部分爲a-b,那麼b加上一個(a-b)的一半,或者a減去一個(a-b)的一半,得到的不就是a和b的平均值嗎。
在這裏插入圖片描述

int a,b,c=0;
scanf("%d%d",&a,&b);
c=b+(a-b)/2
printf(“%d”,c);

那麼這樣就能有效地避免數據溢出問題。
第三種:求同異法
我們知道任何一個數在內存中是以二進制存放的,我們可以通過&求得兩個數比特位的相同部分,通過^得到兩個數的不同部分。而不同的部分恰好是a比b多出的部分,所以a+b可表示爲(a&b)*2+(a ^b).那麼平均數就是(a&b)+(a ^b)/2;

int a,b,c=0;
scanf("%d%d",&a,&b);
c=(a&b)+(a ^b)/2;//c=(a&b)+(a^b)>>1
printf("%d",c);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章