gpt4 book ai didi

javascript - JS 中的欧拉项目#23

转载 作者:行者123 更新时间:2023-12-03 08:17:40 25 4
gpt4 key购买 nike

我对 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/作为指导,但我的结果不同。我是编程社区的一个相当大的新手,所以请记住这一点。

最佳答案

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

1 + 2 + ... + number = (number * (number + 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 整除。除此之外,你的功能并不是最佳的。一旦发现数字充足,您就应该返回true。此外,divisors 的名称具有误导性,您应该使用更有意义的名称来命名您的函数,例如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);

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

关于javascript - JS 中的欧拉项目#23,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33867946/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com