所以当我丢失所有代码时,我重新启动了Project Euler。我在problem 23。我知道怎么做,而且之前我已经完成了,但它现在不能正常工作,而且我一直在努力解决这个问题,我几乎无法直接思考。我这次正在使用NodeJS。
根据this really simplified article,我可以使用素数因子分解来计算出一个除数的总和。所以我有这两个功能:
Util.GetPrimeFactors = function (val) {
var init = val;
var num = 2;
var primes = {};
while (val > 1) {
if (val % num == 0) {
if (num == init) return [];// prevent prime numbers from including themselves
if (primes[num]) {
primes[num]++;
} else {
primes[num] = 1;
}
val /= num;
} else {
num++;
}
}
return primes;
}
Util.SumOfDivisors = function (val) {
var primes = Util.GetPrimeFactors(val);
var coeff = primes[0];
var count = 0;
var total = 1;
for (var i in primes) {
count++;
if (primes[i] > 1) {
var n = parseInt((Math.pow(parseInt(i), primes[i] + 1) - 1) / (parseInt(i) - 1))
console.log(n);
total *= n;
} else {
var n = parseInt(i) + 1
console.log(n);
total *= n;
}
}
if (count == 1) return 1;
return total;
}
如果我致电GetPrimeFactors(12)
,我会收到此对象:{ '2': 2, '3': 1 }
代表2^2+3
,名称是基值,值是指数。 SumOfDivisors
使用该对象在上面链接的文章中进行数学运算。问题是根据项目欧拉问题,12是第一个丰富的数字。如果我通过SumOfDivisors
运行6,我会得到正确的素数因子(对象{ '2': 1, '3': 1 }
),但它会导致SumOfDivisors返回12,使6看起来很丰富。如果你以低效的方式加上因子(数学文章中的子弹B),那么你显然得到因子1,2和3,这使得6成为一个完美的数字。
我记得在我的旧C#代码中我使用了相同的技术:查找素数并使用它们来除数除数。但我没有这个问题6(可能还有更多的数字)。因为我在这里做错了,我很失败。当我找到除数的总和时,我做错了什么?这种技术是否已知不适用于某些值?我在特殊情况下上釉吗?我抓到了Javascript gotcha?
答案 0 :(得分:1)
您的代码正在完成文章所说的内容。
项目欧拉实际上要求适当的除数之和:
28将是1 + 2 + 4 + 7 + 14 = 28
虽然本文指定了正整数除数之和的算法:
12将是1 + 2 + 3 + 4 + 6 + 12 = 28
请注意,第一种情况不包括数字本身,而第二种情况不包括数字本身。这就是为什么6不丰富(1 + 2 + 3 = 6),但其积分除数之和为12(1 + 2 + 3 + 6)。