そのため、すべてのコードを失ったときに Project Euler を再起動しました。問題 23です。やり方は知っているし、以前にもやったことがありますが、今はうまくいきません。今回はNodeJSを使用しています。
この非常に単純化された記事によると、素因数分解を使用して、数値の約数の合計を計算できます。したがって、次の2つの機能があります。
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 が最初に豊富な数であるということです。6 から を実行するSumOfDivisors
と、適切な素因数 ( オブジェクト{ '2': 1, '3': 1 }
) が得られますが、SumOfDivisors が 12 を返す結果になり、6 が豊富に見えます。因数を効率の悪い方法で足し合わせると (数学記事の箇条書き B)、明らかに因数 1、2、および 3 が得られ、6 は完全数になります。
以前の C# コードで、素数を見つけてそれを使用して除数を合計するという同じ手法を使用したことを覚えています。しかし、6 (そしておそらくもっと多くの数字) ではこの問題はありませんでした。私はここで間違っていることに途方に暮れています。除数の合計を見つけるときに何が間違っていますか? この手法は、特定の値に対して機能しないことが知られていますか? 私は特別なケースの上にガラス張りですか?私はJavascriptの落とし穴に引っかかっていますか?