您好,登錄后才能下訂單哦!
小學數學中我們就學過一種簡單的求解兩個整數平均數的算法(a+b)/2,當然它同樣適用于我們的C語言
#include<stdio.h> #include<stdlib.h> int?main()?{ ?int?a?=?10; ?int?b?=?20; ?printf("%d\n",?(a?+?b)?/?2); ?system("pause"); ?return?0; }
但是這種方法有弊端,我們都知道int是4個字節也就是32個比特位如果a和b的數加起來超過×××所能容納的數字,我們就無法得到a和b的平均值
#include<stdio.h> #include<stdlib.h> int?main()?{ ?int?a?=?2000000000; ?int?b?=?2000000000; ?printf("%d\n",?(a?+?b)?/?2); ?system("pause"); ?return?0; }
如圖我們并不能求出a和b的平均值;
2.所以我們在寫代碼過程中為了避免此類情況的發生,我們采用另一種方法a+(b-a)/2,這樣,只要a和b不越界,他們的平均值就可以算出來
圖解
用這種方法就不會導致上面的情況發生
#include<stdio.h> #include<stdlib.h> int?main()?{ ?int?a?=?2000000000; ?int?b?=?2000000004; ?printf("%d\n",?b+(a-b)/2); ?system("pause"); ?return?0; }
3.可是如果考慮這個方法的效率的話,我覺得這個方法不太完美,在C語言中除法的算法是最復雜的,時間最長,所以我們應該用一種方法來替代這個除法,大家先看這個算式b+(a-b)>>1;
用2進制右移的方法我們避免了這個問題;
#include<stdio.h> #include<stdlib.h> int?main()?{ ?int?a?=?2000000000; ?int?b?=?2000000004; ?printf("%d\n",?b+((a-b)>>1)); ?system("pause"); ?return?0; }
我們得出同樣的答案,并且縮短了這個程序運行時間,使得代碼效率提升。
4.當然我們提到了二進制向右移位來求解,是否還有其它方法來求解呢,最后一種方法:AVG=(a&b)+((a^b)>>1),很多人可能一眼看不懂這個代碼,我們來詳細圖解一下
我們用代碼進行驗證:
#include<stdio.h> #include<stdlib.h> int?main()?{ ?int?a?=?2; ?int?b?=?10; ?printf("%d\n",?(a&b)+((a^b)>>1)); ?system("pause"); ?return?0; }
----------------------------------------------------------------------------------------------------------------------------------
總結:以上就是整數求平均數的四種算法,前三種慢慢遞進,解決掉一些潛在bug或著提升計算效率,第四種效率也很高,但是不容易理解,大家還有什么求整數平均數的算法,歡迎在評論區留言
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。