javascript - 查找具有超过 500 个因子的数字的问题

标签 javascript

好吧,这是 projecteuler 网站上的第 12 个问题:

三 Angular 形数列是由自然数相加生成的。所以第 7 个三 Angular 形数是 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28。前十项是:

1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...

让我们列出前七个三 Angular 形数的因数:

 1: 1
 3: 1,3
 6: 1,2,3,6
10: 1,2,5,10
15: 1,3,5,15
21: 1,3,7,21
28: 1,2,4,7,14,28

我们可以看到 28 是第一个有超过五个因数的三 Angular 形数。

第一个除数超过五百的三 Angular 形数是多少?

这是我的代码(我是 Javascript 的新手)

let num = 1;
let add= 1;
let divisors = [];

while (divisors.length < 500){
  divisors = []

  for(let i = 1; i <= num; i++){
    if(num % i == 0){
      divisors.push(i);
    }
  }

  add ++;
  num += add;
}
console.log(num - add)

当我将 while 循环条件更改为 300 或更少时,此代码运行良好。 此代码在 Intel i7 Q740 1.75GHz 上运行。 当我尝试它时,控制台上没有任何显示,我的问题是那是因为我的 CPU 和电源不足或我的代码有问题?我等了大约 20 分钟,但仍然没有任何结果。

最佳答案

正如@Vasil Dininski 指出的那样,此代码效率不高,但您不会达到最大整数,您只需等待一段时间让程序计算即可。

我建议优化您的代码,例如通过编写一个简单的函数来返回当前数字的除数。

这看起来类似于:

function numberOfDivisors(num) {
  var numOfDivisors = 0;
  var sqrtOfNum = Math.sqrt(num);

  for(var i = 1; i <= sqrtOfNum; i++) {
    if(num % i == 0) {
      numOfDivisors += 2;
    }
  }
  // if your number is a perfect square you have to reduce it by one
  if(sqrtOfNum * sqrtOfNum == num) {
    numOfDivisors--;
  }
  return numOfDivisors;
}

然后你可以像这样在你的 while 循环中使用这个方法:

var maxNumOfDivisors = 500;
var num = 0;
var i = 1;

while(numberOfDivisors(num) < maxNumOfDivisors) {
  num += i;
  i++;
}

这会返回正确的三 Angular 数。

另请注意,三 Angular 形数字从 0 开始,这就是我的数字为 0 的原因。

关于javascript - 查找具有超过 500 个因子的数字的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57599265/

相关文章:

javascript - Bootstrap 标签输入事件示例

javascript - 在谷歌地图中创建矩形

javascript - jqxTree : Changing font color after initialization

javascript - 循环数组并获取上一个值时第一项的特殊情况?

javascript - Android 浏览器中的页脚按钮

javascript - HTML5/JS 约束验证 Bug

javascript - 什么是选择器引擎?

javascript - Safari getUserMedia() 未处理的 promise 拒绝

javascript - 为什么这个 javascript 代码片段,outerString 输出“undefined”?

javascript - 每次我更改 $(window).width() 时运行我的代码