Javascript 查找500个以上因子的数的问题

Javascript 查找500个以上因子的数的问题,javascript,Javascript,这是projecteuler网站上的第12个问题: 三角形数序列是通过添加自然数生成的。所以第七个三角形的数字是1+2+3+4+5+6+7=28。前十个任期为: 1、3、6、10、15、21、28、36、45、55 让我们列出前七个三角形数字的系数: 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是第一个有超过五个除数的三角形数 第一个有500个以上除数的三角

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

三角形数序列是通过添加自然数生成的。所以第七个三角形的数字是1+2+3+4+5+6+7=28。前十个任期为:

1、3、6、10、15、21、28、36、45、55

让我们列出前七个三角形数字的系数:

 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是第一个有超过五个除数的三角形数

第一个有500个以上除数的三角形数的值是多少

下面是我的代码(我是Javascript新手)

让num=1;
让加法=1;
设除数=[];
while(除数。长度<500){
除数=[]

对于(设i=1;i,如果我的计算没有错,那么在前一个除数的每一个下一个除数上再加一个,就得到了最终结果

let prev = 0;

for(let i=0; i < 500; i++) {
    prev = prev + i;
}
console.log("AA ", prev);
让prev=0;
for(设i=0;i<500;i++){
prev=prev+i;
}
控制台日志(“AA”,prev);

正如您可能已经注意到的,此算法可能有点暴力。更好的算法是结合一些东西。假设我们要查找的数字是“n”:

  • 找到[1,n的平方根]范围内的所有素数。您将 正在迭代
    n
    ,因此 将有助于提高效率(你可以记忆你已经找到的素数)
  • 假设任何数字都可以表示为一个素数乘以某次方,再乘以一个素数乘以某次方,等等。你可以找到这些素数乘以某次方的所有组合,它们是
    n
    的除数

  • 这将是一种更有效的方法,尽管查找它们的方法更复杂。您可以查看此quora答案以了解更多详细信息:

    正如@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;
    }
    
    函数数除数(num){
    var numOfDivisors=0;
    var sqrtOfNum=Math.sqrt(num);
    
    对于(var i=1;我确保您不会使用JavaScript来表示数字。除此之外,
    i++
    不起作用,循环变得无限。@axiac是否应该像BigInt(i)一样用BigInt包装它什么是
    n
    ?似乎不是defined@JonasWilms对不起,我确定了几个问题:<代码> N<代码>应该是代码> Num < /Cord>和<代码>我认为这不起作用,再一次考虑这个问题:
    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;
    }
    
    var maxNumOfDivisors = 500;
    var num = 0;
    var i = 1;
    
    while(numberOfDivisors(num) < maxNumOfDivisors) {
      num += i;
      i++;
    }