好吧,这是 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/