已知有兩個整型變數int a
和int 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個整數,其間以空格分隔。輸出 僅一行。按照數字給出的順序輸出不是兩陣列共有的元素,數字間以空格分隔。題目保證至少存在乙個這樣的...