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