[程式設計] [C_MM04-易] 負數的餘數
源起
[C_MM04-易] 計算總和、乘積、差、商和餘數 這題是 e-tutor 上面的一個題目,它的難度被歸類到中間等級。我猜很多人解不出來的原因是因為題目看起來該死的簡單,但怎麼寫就是錯的,最後就放棄了。
事實上,這個題目藏了一個很重要的hint,解開這個題示,大約就可以寫出這題了。
這個提示是:
※餘數≧0。
要求餘數的輸出一定要為正數。所以在有餘數為負數時,就要小心了。
什麼時候 a/b 的餘數會有負數?
a 為負數且 b 為負數時
或
a 為負數時
看看底下的例子
第5行及第6行都會輸出 -1。所以啦,這就是造成出錯的原因了!
先查一下餘數的定義吧! (這是中文的,請快樂的服用)
由維基百科的說明可以看得出來:
a/b = 商 (q)...餘數 (r)
這樣的公式可以改寫為
a = q * b + r (被除數 = 商 * 除數 + 餘數)
所以
-10 / 3 = -3...-1
套公式
-10 = (-3) * 3 + -1
也可以寫為
-10 = (-4) * 3 + 2
也就是說
-10 / 3 = -3...-1 可以改寫為
-10 / 3 = -4...2 //哇哈哈,我們把餘數變成正數了!!
再來看一個例子:
-10 / -3 = 3...-1
套公式
-10 = (3) * -3 + -1
改寫為
-10 = (4) * -3 + 2
所以 -10 / 3 = 4...2 (商為 4,餘數為 2)
瞭解了原理後,就很容易寫出程式碼了。
解法
那該怎麼辦先查一下餘數的定義吧! (這是中文的,請快樂的服用)
由維基百科的說明可以看得出來:
a/b = 商 (q)...餘數 (r)
這樣的公式可以改寫為
a = q * b + r (被除數 = 商 * 除數 + 餘數)
所以
-10 / 3 = -3...-1
套公式
-10 = (-3) * 3 + -1
也可以寫為
-10 = (-4) * 3 + 2
也就是說
-10 / 3 = -3...-1 可以改寫為
-10 / 3 = -4...2 //哇哈哈,我們把餘數變成正數了!!
再來看一個例子:
-10 / -3 = 3...-1
套公式
-10 = (3) * -3 + -1
改寫為
-10 = (4) * -3 + 2
所以 -10 / 3 = 4...2 (商為 4,餘數為 2)
瞭解了原理後,就很容易寫出程式碼了。
程式
底下程式碼的第18行到24行是所有的核心。
當我們判斷餘數為「負數」時,就進入到18行到24行。
接著判斷商數為「正數」,或是「負數」
正數的例子就是
-10 / -3 = 3...-1
負數的例子就是
-10 / 3 = -3...-1
接著就是變動商數(第20及22行),然後重算餘數(第24行)
留言
張貼留言