2014-01-26 19 views
5

如何在不使用模運算符的情況下查找除以兩個數字的餘數! 我的老師給了我這個確切的練習,而且這只是我在編程基礎課程中的第5次講座。
我已經嘗試過這個公式,編寫一個程序來查找除以兩個數字的餘數,而不使用%運算符?在Java中

a%b = a - (a/b)*b 

但它總是返回零!

+1

什麼數據類型是'a'和'b'? –

+2

你有正確的想法,讓我們看看你寫的確切代碼,包括變量聲明。 – Jems

+3

如果你定義'a'和'b'是雙打或浮點數,那麼你總是會得到'0'(或者一個非常接近'0'的數字)。如果它們是整體類型,你應該有什麼工作。 – apnorton

回答

3

我只是嘗試這樣做

public static void main (String [] args){ 
    int a = 50; 
    int b = 9; 

    int c = a%b; 
    int d = a - (a/b)*b; 

    System.out.println(c); 
    System.out.println(d); 
} 

它似乎工作。你的變量是什麼類型?

+0

我用過雙打! – Django

+0

@ user2894634雙打它當然會是0.你可以使用A Boschman的答案,它會工作 –

+0

OP在問題中說這不適合他/她。重複這個問題並不構成回答。 –

3

那麼,你可以做模運算符通常在內部做什麼。

內部循環,從a。減去b反覆。當這不再可能時,你留下的數字就是你的答案。

下面是一個代碼示例。 如果您正在嘗試爲十進制數字完成此操作,請注意浮點值的舍入錯誤。

double result = a; 
while(result - b >= 0) { 
    result -= b; 
} 
return result; 

需要注意的是,如果你與整數工作,和你被允許使用該除法運算符,你不需要使用循環。

但是,請記住,所有的分工都是重複減法。如果這是出於教學目的,我認爲按我的方式做這件事很酷。

+0

謝謝,這是一個好主意!但我還沒有研究循環! – Django

+0

如果餘數爲零,這會給出錯誤的結果。 –

+0

謝謝,修復它(我希望)。已經工作了9個小時,不能再看直了。 –

0

當使用double的時候,那些公式總是返回0。當使用int該公式必須因截斷(整數除法)而工作。

以下是計算除法餘數的算法。比方說,你想找到a % b

while dividend is larger or equal than divisor 
    substract divisor from dividend 
print last result 

實現在Java中它看起來像:

public static void main(String[] args) 
{ 
    double a = 5, b = 2; 

    while (a >= b) { 
     a -= b; 
    } 
    System.out.println(a); 
} 
+0

如果你用'a = 0.3'和'b = 0.1'來試試這個,你不會得到正確的答案。 –

+0

我downvote被鎖定,但我想刪除它 - 請參閱ABoschman的答案爲什麼我的評論。如果你稍微編輯一下,我將不會退出。 –

+0

@DavidWallace它也發生在我身上。編輯。感謝您指出這個問題(使用'0.3','0.1')。看起來很有趣。 – Christian

2

這是沒有意義的上doublefloat號碼進行%,因爲浮點數實際上每一個代表一個非常小的值範圍,而不是一個確切的值。通常情況下,浮點數的內部表示與您用於創建數字的實際小數不在該範圍內。這意味着對於浮點類型,%的結果在形式上是未定義的。

如果您在Java中嘗試0.3 % 0.1,那麼實際上您會得到0.09999999999999998,這似乎乍一看是錯誤的;但考慮到浮點數的真實表示,這與其他結果一樣有意義。

這裏是工作了%,實際上並沒有使用%最簡單的解決方案。

a - b * (long)(a/b); 

它會比做重複減法的答案更好,因爲它不必一遍又一遍地循環。

但是這種解決方案不可避免地會成爲與此頁面上某些其他答案相同的陷阱的犧牲品,即「正確」的答案在形式上是不確定的。

如果您的數字非常大,此解決方案也會導致溢出問題。

+1

如果'a'和'b'很大,重複的減法不可能返回正確的結果。 –

+0

@MatthewLundberg真正的數據。 –

1

您需要採用a/b的Math.floor。

你有%B = A - (A/B)* B 但真的%B = A-(Math.floor(A/B)* B)

這是因爲沒有數學.floor它包含十進制餘數和(a/b)* b等於a,所以當你從中減去它時,每次都會得到0,就像你經歷過的一樣。

相關問題