[程式設計] [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)

瞭解了原理後,就很容易寫出程式碼了。

程式

底下程式碼的第18行到24行是所有的核心。
當我們判斷餘數為「負數」時,就進入到18行到24行。

接著判斷商數為「正數」,或是「負數」
正數的例子就是
-10 / -3 = 3...-1

負數的例子就是
-10 / 3 = -3...-1

接著就是變動商數(第20及22行),然後重算餘數(第24行)

留言

這個網誌中的熱門文章

由 Pandas 的 DataFrame 中取得資料

[程式設計] C++ 的字串切割

[C++]在 cin 後呼叫 getline 所遇到的問題