求兩個整型數的中間值

2021-10-10 03:16:15 字數 812 閱讀 4042

已知有兩個整型變數int aint b,求這兩個數的中間值,即int c

c =

(a + b)/2

;

你能想出上述操作可能會存在的問題嗎?

答案是,加法過程中可能會溢位。

因此,我們可以這麼做

c = a/

2+ b/

2;

雖然解決了溢位的問題,但仍然還有缺點,你能想到是什麼嗎?

答案是,用了兩次除法,執行效率會顯著降低,因為除法是所有基礎運算中最慢的。

因此,我們又可以這麼做

c = a +

(b-a)/2

;

好了,這次既解決了溢位問題,也解決了使用兩次除法的問題。

那麼,還可以優化嗎?

當然可以,只需將除法轉換為右移操作》即可。

因為移位操作是在系統底層進行的,所以速度更快。

c = a +

(b-a)

>>2;

//或者, c = a>>2 + b>>2;

題外話:可能你會覺得就乙個求中間值的操作有必要這麼大驚小怪嗎,對效率的影響也是微不足道的,但是任何乙個小數乘以乙個很大的數時,它將變得不再微不足道了,例如,如果全國人民每人都給我1分錢,我早就是百萬富翁了。求中間值大多出現在排序和查詢演算法中,如快速排序法、二分查詢法等等,當操作的陣列很大時,就有可能會出現溢位和效率等問題,所以學習這個還是很有必要的。

求兩個整型數的平均數

兩數相加除以2 這種寫法是簡單將兩個數相加,然後除以2。include int main 這種 是有弊端的,當x y的值大於2147483674時會發生溢位 32位機器上int佔4個位元組,範圍是 2147483648 2147483674 這種情況下兩個正數求出的平均值就是負數!如下 includ...

求兩個有序整型陣列的交集

有兩個有序的整型陣列a和b 沒有重複元素 他們的長度分別為lena和lenb,求出他們的共同元素。例如 a 0,1,3,5,7,9,11 b 2,3,4,7,11 它們的交集為。求交集的方法有很多種,但陣列的長度會影響演算法的效率。2.1.1 二路歸併 對於陣列a,b分別以i,j從頭遍歷陣列。如果當...

求兩個整型陣列的非共有元素

題目描述 給定兩個整型陣列,要求找出不是兩者共有的元素。輸入 有兩行。第1行先給出正整數n n 20 隨後是n個整數,其間以空格分隔。第2行先給出正整數m m 20 隨後是m個整數,其間以空格分隔。輸出 僅一行。按照數字給出的順序輸出不是兩陣列共有的元素,數字間以空格分隔。題目保證至少存在乙個這樣的...