JS中的项目Euler#23

时间:2015-11-23 09:50:09

标签: javascript

我的结果是1到28321之间的数字(限制)

  • 所有数字的总和:395465626
  • 所有数字的总和:392188885
  • 所有非丰富数字的总和: 3276741 (正确答案是4179871)

var divisors = function(number){ 
sqrtNumber = Math.sqrt(number);
var sum = 1;
for(var i = 2; i<= sqrtNumber; i++) 
{
    if (number == sqrtNumber * sqrtNumber) 
    {
        sum += sqrtNumber;
        sqrtNumber--;
    }
    if( number % i == 0 )
    {
        sum += i + (number/i); 
    }       
}
    
    if (sum > number) {return true;}
    else {return false;}
};

var abundent = [], k = 0;
var upperLimit = 28123;
for (var i = 1; i <= upperLimit; i++)
{
	if (divisors(i)) 
    {abundent[k] = i; k++};
    
} 

var abundentCount = abundent.length;
var canBeWrittenAsAbundant = []; 
for (var i = 0; i < abundentCount; i++){
    for (var j = i; j < abundentCount; j++){
         if (abundent[i] + abundent[j] <= upperLimit){canBeWrittenAsAbundant[abundent[i]+abundent[j]] = true;}
     else {
        break;
     	}
  	}
}

for (i=1; i <= upperLimit; i++){
    if (canBeWrittenAsAbundant[i] == true){continue;}
    else {canBeWrittenAsAbundant[i] = false;}
}

var sum = 0;
for (i=1; i <= upperLimit; i++)
{
    
    if (!canBeWrittenAsAbundant[i]){
        sum += i;
    }
}

 console.log(sum);

我使用http://www.mathblog.dk/project-euler-23-find-positive-integers-not-sum-of-abundant-numbers/作为指导,但我的结果不同。我是编程社区的一个新手,所以请记住这一点。

2 个答案:

答案 0 :(得分:1)

您不需要使用循环计算所有数字的总和,因为有一个公式,如下所示:

  

1 + 2 + ... +数字=(数字*(数字+ 1))/ 2

接下来,让我们来看看除数:

var divisors = function(number){ 
sqrtNumber = Math.sqrt(number);
var sum = 1;
for(var i = 2; i<= sqrtNumber; i++) 
{
    if (number == sqrtNumber * sqrtNumber) 
    {
        sum += sqrtNumber;
        sqrtNumber--;
    }
    if( number % i == 0 )
    {
        sum += i + (number/i); 
    }       
}

    if (sum > number) {return true;}
    else {return false;}
};

您将sum初始化为1,因为它是一个除数。但是,我不太明白为什么要迭代直到平方根而不是数字的一半。例如,如果您将函数调用为100,那么您将迭代直到i达到10.但是,例如,100可以被20整除。除此之外,您的功能不是最佳的。一旦发现return true很丰富,您应该number。此外,divisors的名称具有误导性,您应该将function命名为更重要的名称,例如isAbundant。最后,我不明白为什么如果number恰好是它的确切方格,你减少平方根,如果你这样做,为什么你在循环中进行这种检查。实现:

var isAbundant = function(number) {
    var sum = 1;
    var half = number / 2;
    for (var i = 2; i <= half; i++) {
        if (number % i === 0) {
            sum += i;
            if (sum > number) {
                return true;
            }
        }
    }
    return false;
}

请注意,该功能并不认为完美的数字很丰富。

您不需要存储所有数字,因为您正在计算汇总数据。相反,这样做:

//we assume that number has been initialized
console.log("Sum of all numbers: " + ((number * (number + 1)) / 2));
var abundantSum = 0;
var nonAbundantSum = 0;
for (var i = 0; i <= number) {
    if (isAbundant(i)) {
        abundantSum += i;
    } else {
        nonAbundantSum += i;
    }
}
console.log("Sum of non abundant numbers: " + nonAbundantSum);
console.log("Sum of abundant numbers: " + abundantSum);

代码未经过测试。另外,请注意溢出问题并构建代码。

答案 1 :(得分:0)

下面是NodeJS的更正代码。

    var divisors = function (number) {
    sqrtNumber = Math.sqrt(number);
    var sum = 1;
    var half = number / 2;
    for (var i = 2; i <= half; i++) {
        if (number % i === 0) { sum += i; }
    }
    if (sum > number) { return true; }
    else { return false; }
};
var abundent = [], k = 0;
var upperLimit = 28123;
for (var i = 1; i <= upperLimit; i++) {
    if (divisors(i)) { abundent[k] = i; k++ };
}
var abundentCount = abundent.length;
var canBeWrittenAsAbundant = [];
for (var i = 0; i < abundentCount; i++) {
    for (var j = i; j < abundentCount; j++) {
        if (abundent[i] + abundent[j] <= upperLimit) { canBeWrittenAsAbundant[abundent[i] + abundent[j]] = true; }
        else {
            break;
        }
    }
}
for (i = 1; i <= upperLimit; i++) {
    if (canBeWrittenAsAbundant[i] == true) { continue; }
    else { canBeWrittenAsAbundant[i] = false; }
}

var sum = 0;
for (i = 1; i <= upperLimit; i++) {
    if (!canBeWrittenAsAbundant[i]) {
        sum += i;
    }
}

console.log(sum);