天天看點

向上取整的方法_正整數相除的向上取整算法(巧妙思維設計)

向上取整的方法_正整數相除的向上取整算法(巧妙思維設計)

大家好:

今天我來和大家讨論一個相對簡單的問題-----整數(正)相除的向上取整算法;

案例1): 一個青蛙跳躍一次的步長為3,現在它垂直于馬路方向要跳躍整條馬路。假定馬路的款為---x長? 問:它最少需要跳躍幾次能夠完全跳過這條馬路?

案例2) : 一個房間可以住6個人,現在來了一群人 人數為 x 。 問最少需要多少個房間才能讓這x個人都可以住下? 假設一個房間住滿的情況下,才安排另外一個房間。

案例3) : 假設我們在頁面浏覽資料時,一個頁面最多能夠顯示20條資料,現在通過查詢,得到的資料量為x,問需要多少頁才能夠将這x項資料都呈現出來?

我想大家都已經明白這幾個問題的需求了? 看起來非常簡單的邏輯;

問題1)----假設馬路的長度是10,青蛙一次跳3,跳3次的距離是9 ,4次的距離是12;為了能完全跳過馬路,需要跳躍4次;=====》10/3+1=4

如果馬路的長度是12=====》12/3=4

如果馬路的長度是13=====》13/3+1=5 需要5次才能完全過去;

問題2) 問題3) 都是同樣的道理! 相信很多朋友已經找到了解決此類問題的答案:

結果result= x%n==0 ? x/n : x/n +1; (n位每一步的長度)?

經典的三目運算完全可以解決此類問題! 但今天我想給大家介紹一個針對此類問題較為巧妙的算法公式: ========》 result=(x+n-1)/n ;

why? 分子是總量加上不長減去1 ,運算後的結果再去除以不長。

我們要明白計算機中的整數運算是向下取整的,也就是如果能整除,沒有餘數,那結果正好是得到的答案; 如果不能整除,有餘數,就将餘數舍棄,保留相除後的整數部分。但此時正好 和我們想要得到的結果(向上取整)相差一個。

我們再回投看看計算公式的分子部分-------(x+n-1) =====(x+(n-1)) , n-1 比除數n 就小1 。(n-1)/n 等于0 但是一旦有一個非零的正整數 與n-1 相加 器結果必然不是0 至少是1; 此時正好與x/n 取餘數相結合,x/n的餘數範圍在 0 ~(n-1)之間,器與n-1相加 範圍就是(n-1)~(2n-1)之間 如果n是大于0的整數 , 一個(n-1)~(2n-1)的數與n相除,器結果必然是0 或1 且隻有在x是n的整倍數的情況下以上結果才能為0;

經過分析,x如果是n的整倍數,(x+n-1)/n 的結果就是x/n 如果不是(有餘數)(x+n-1)/n===》x/n +1 ; 是以公式: result=(x+n-1)/n ; 完全可以表示來個整數相除(x>=n的情況) 結果向上取整; (感覺方法好嗎?歡迎大家來交流!!!)

人生隻有一次,要使勁兒牛B啊!

---北野武