2017-10-11 70 views
0

代碼之間的計算方法的差異我一直在尋找一個答案從項目歐拉問題,我發現一個在這裏是什麼在C#和Javascript

http://www.mathblog.dk/triangle-number-with-more-than-500-divisors/

int number = 0; 
int i = 1; 

while(NumberOfDivisors(number) < 500){ 
    number += i; 
    i++; 
} 

private int NumberOfDivisors(int number) { 
    int nod = 0; 
    int sqrt = (int) Math.Sqrt(number); 

    for(int i = 1; i<= sqrt; i++){ 
     if(number % i == 0){ 
      nod += 2; 
     } 
    } 
    //Correction if the number is a perfect square 
    if (sqrt * sqrt == number) { 
     nod--; 
    } 

    return nod; 
} 

於是,我就實現在JavaScript中的相同的解決方案,但它不給我相同的結果。

var number = 0; 
var i = 1; 

while (numberOfDivisors(number) < 500) { 
    number += i; 
    i++; 
} 

console.log(number); 

function numberOfDivisors(num) { 
    var nod = 0; 
    var sqr = Math.sqrt(num); 

    for (i = 1; i <= sqr; i++) { 
    if (num % i === 0) { 
     nod += 2; 
    } 
    } 

if (sqr * sqr == num) { 
    nod--; 
} 

    return nod; 
} 

我測試在C#的其他代碼,它給出了合適的解決方案。我想知道我是否犯了一個錯誤,或者他們在某些我不知道的方面工作不同。

+0

你碰巧注意到任何* par關於JS版本的結果有什麼不同?它可能不是一個整數?什麼? –

+3

「它提供了正確的解決方案」 - 什麼是正確的解決方案? –

+1

當你調試這兩個代碼片段時,他們的行爲在哪裏完全不同,而且它們究竟有什麼不同? – jmcilhinney

回答

5

的問題是,你正在測試非三角形的數字,因爲你忘了一件重要的事情... ...範圍

for (i = 1; i <= sqr; i++) { 

螺絲的(全球)的i值...

看到在C#中你有

for(int i = 1; i<= sqrt; i++){ 
    ^^^ 

給予的JavaScript同樣的禮貌和嘗試

for (var i = 1; i <= sqr; i++) { 
    ^^^ 

你也應該得到平方根爲整數,否則你會在最計數

var sqr = Math.floor(Math.sqrt(num)); 

var number = 0; 
 
var i = 1; 
 
console.time('took'); 
 
while (numberOfDivisors(number) < 500) { 
 
    number += i; 
 
    i++; 
 
} 
 
console.timeEnd('took'); 
 
console.log(number); 
 

 
function numberOfDivisors(num) { 
 
    var nod = 0; 
 
    var sqr = Math.floor(Math.sqrt(num)); 
 

 
    for (var i = 1; i <= sqr; i++) { 
 
    if (num % i === 0) { 
 
     nod += 2; 
 
    } 
 
    } 
 

 
    if (sqr * sqr == num) { 
 
    nod--; 
 
    } 
 

 
    return nod; 
 
}

一關(增加了一些有趣的時間信息)