[程式設計] [C_MM04-易] 負數的餘數
源起
[C_MM04-易] 計算總和、乘積、差、商和餘數 這題是 e-tutor 上面的一個題目,它的難度被歸類到中間等級。我猜很多人解不出來的原因是因為題目看起來該死的簡單,但怎麼寫就是錯的,最後就放棄了。
事實上,這個題目藏了一個很重要的hint,解開這個題示,大約就可以寫出這題了。
這個提示是:
※餘數≧0。
要求餘數的輸出一定要為正數。所以在有餘數為負數時,就要小心了。
什麼時候 a/b 的餘數會有負數?
a 為負數且 b 為負數時
或
a 為負數時
看看底下的例子
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
using namespace std; | |
int main() { | |
cout<<-10%-3<<endl; | |
cout<<-10%3<<endl; | |
cout<<10%-3<<endl; | |
return 0; | |
} |
第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行)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <iomanip> | |
#include<cmath> | |
using namespace std; | |
int main() { | |
int a, b; | |
cin >> a >> b; | |
cout << a << "+" << b << "=" << a + b << endl; | |
cout << a << "*" << b << "=" << a * b << endl; | |
cout << a << "-" << b << "=" << a - b << endl; | |
int r = a % b; | |
if (r >= 0) | |
cout << a << "/" << b << "=" << a / b << "..." << r << endl; | |
else | |
{ | |
int q = a / b; | |
if (q < 0) | |
q -= 1; | |
else | |
q += 1; | |
r = a - b*q; | |
cout << a << "/" << b << "=" << q << "..." << r << endl; | |
} | |
return 0; | |
} |
留言
張貼留言