我正在寻找欧拉项目问题的答案,我在这里找到了答案
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# 测试了其他代码,它给出了正确的解决方案。我想知道我是否犯了一个错误,或者它们在我不知道的某些方面是否有不同的工作方式。
最佳答案
问题是您正在测试非三 Angular 形数字,因为您忘记了一件重要的事情...范围...
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;
}
(添加了一些计时信息以供娱乐)
关于javascript - C# 和 Javascript 代码的计算有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46678340/