私は再びプロジェクトオイラーの課題を楽しんでいますが、12番のソリューションは、~593.275 ms
ランスルーごとに最も遅いソリューションの1つであることに気づきました。~1254.593 ms
これは、ランスルーごとに10番の私のソリューションに次ぐものです。3 ms
私の他のすべての答えは、最もよく下で実行するよりも少ないです1 ms
。
問題12の私のJavaソリューション:
主要():
int index = 1;
long currTriangleNum = 1;
while (numDivisors(currTriangleNum) <= 500) {
index++;
currTriangleNum += index;
}
System.out.println(currTriangleNum);
numDivisors():
public static int numDivisors(long num) {
int numTotal = 0;
if (num > 1)
if (num % 2 == 0) {
for (long i = 1; i * i <= num; i++)
if (num % i == 0)
numTotal+=2;
} else {
// halves the time for odd numbers
for (long i = 1; i * i <= num; i+=2)
if (num % i == 0)
numTotal+=2;
}
else if (num == 0)
return 0;
else if (num == 1)
return 1;
else (num < 0)
return numDivisors(num *= -1);
return numTotal;
}
。
ソリューションフォーラムを見回すと、これらの式(n =(p ^ a)(q ^ b)(r ^ c)...&d(n)=(a + 1)(b + 1)( c + 1)...)彼らのために働いたが、私は個人的にそれがこれ以上速くなるかどうかわからない。手作業で速くなるかもしれませんが、プログラムではそうではありません。
。
基本的な思考プロセスは次のとおりです。
48 = (2^4)(3^1)
48の約数を計算したいと思います。以下の因子ツリーを見ると、 [n =(p ^ a)(q ^ b)(r ^ c)...]と結論付けることができます。
48
/ \
2 24
/ \
2 12
/ \
2 06
/ \
2 3
これを知って、式d(48) = (4+1)(1+1)
[d(n)=(a + 1)(b + 1)(c + 1)...]を作成し、48に10個の因子があることを決定します。
d(n) = (a+1)(b+1)(c+1)...
d(48) = (4+1)(1+1)
d(48) = (5)(2)
d(48) = 10
。
コードを最適化するにはどうすればよいですか?これらの式は最良の解決策ですか?すべての素因数を見つけて、数式を実装するのは、私がすでに実施しているプログラムよりも時間がかかると思います。
どうもありがとう、
ユスティニアヌス
編集:
誰かがリンクを投稿し始める前に、私は運がなくてもSOで同様の質問を見回しました。私は、すでに配置されているものよりも速く実行されるメソッドの実装を考えることができません。
EDIT2:
エラトステネスのふるいでの2回目の試み(問題10の場合):
int p = 3, n = 2000000;
long total = 0;
boolean[] sieve = new boolean[n];
for (int i = 3; i < n; i += 2)
sieve[i] = true;
sieve[2] = true;
while (p * p < n) {
for (int i = p; i < n; i++)
if (sieve[i] && (i % p) == 0)
sieve[i] = false;
p++;
while (!sieve[p])
p++;
}
for (int i = 0; i < n; i++)
if (sieve[i])
total += i;
System.out.println(total);
で実行され~985.399 ms
ます-他の方法よりもそれほど速くはありませんが、まだ最適化されていません。ただし、機能します。