2017-07-03 31 views
0

說明:編寫一個稱爲「模數」的函數。給定2個數字,「模數」返回num1除以num2後的餘數。查找餘數不爲模的兩個數字

這是我的代碼到目前爲止。當我在repl.it上運行時,它會給出正確的餘數,但是當我提交程序時,它會進入無限循環,我不知道爲什麼。我認爲for循環中的返回函數會自動退出它。任何幫助將不勝感激,謝謝。基本上我不斷添加number2,直到它達到數字1或比它高。如果它更高,我會減去數字2一次,並找出差異。

function modulo(num1, num2) { 
    if(num1 === 0) { 
     return 0; 
    } 
    if(num2 === 0) { 
     return NaN; 
    } 
    if(isNaN(num1) === true || isNaN(num2) === true) { 
     return NaN; 
    } 

    var i = 0; 

    for(i = 0; i <= num1;) { 
     i += num2; 
     if(i === num1) { 
     return 0; 
     } 
     else if(i > num1) { 
     i = i - num2; 
     console.log(i, num1); 
     return num1 - i; 
     } 
    } 
} 

var output = modulo(25, 4); 
console.log(output); 
+0

你是什麼意思 「提交程序」 ? – jswebb

+0

對不起,我正在使用repl.it的JavaScript製作網站。提交使用大量測試,確保您的程序正常工作。所以它會測試負數,0和NaN以確保模數是正確的。 – ameet01

+0

這是什麼網站,如果你不介意我問?這很奇怪,因爲我在控制檯中調用了該函數。此外,請參閱下面的答案,瞭解如何清理代碼的一些快速提示。 :) – jswebb

回答

0

我不完全確定無限循環在哪裏出現;我已經將你的代碼插入控制檯,我可以調用該函數。您使用哪個網站進行驗證?

此外,在不改變你太多的鍛鍊,我想指出幾個微小的區域,在那裏你可以鞏固你的代碼以提高可讀性:

if(num2 === 0) { 
     return NaN; 
    } 

    if(isNaN(num1) === true || isNaN(num2) === true) { 
     return NaN; 
    } 

可以概括分成

if (num2 === 0 || isNaN(num1) || isNaN(num2)) { 
     return NaN; 
    } 

因爲在JavaScript中,布爾以這樣的方式與真正有價值的東西被認爲是真實的,即isNaN(num1)isNaN(num2)工作是「真」默認情況下。

另外,請記住,您可以使用所有的賦值操作符;它完全是可選的,但由於您使用了一個(i += num2;),我想我會指出您可以在代碼中使用另一個(i -= num2;)。

快樂編碼! :)

0

這可能是另一種選擇:

function modulo(num1, num2) { 
 

 
    if(isNaN(num1) || isNaN(num2)) { 
 
     return NaN; 
 
    } 
 

 
    var strResult = (num1/num2).toString(); 
 
    
 
    var decimalPart = 
 
     parseFloat(strResult.substr(strResult.indexOf("."))); 
 
     
 
    var remainder = Math.round(decimalPart*num2); 
 
    return remainder; 
 
} 
 

 
console.log(modulo(77,9), (77%9)); // 5 
 
console.log(modulo(549,123), (549%123)); // 57 
 
console.log(modulo(33,6), (33%6)); // 3

+0

完全不同的實現並不能解釋爲什麼OP可能會遇到自己的版本問題。 – nnnnnn

+0

檢查後,模數就是'num-mod * Math.floor(num/mod)'。但我認爲這對OP沒有幫助。 – RobG

0
function modulo(num1, num2) { var div = num1/num2; 
var remainder = div - Math.floor(div); // gives the decimal point value left out from the division 
return Math.round(remainder * num2); // multiplies the remainder with num2 and gives a whole number value 
} 

這是相當簡單,應該工作任何時候都