Project Eulerの特徴は、通常、問題を実行するための明白なブルートフォース方式が存在することです。これには、ほぼ永久に時間がかかります。質問が難しくなるにつれて、賢い解決策を実装する必要があります。
この問題を解決する1つの方法は、数値の最小(正の整数)の因数を常に見つけるループを使用することです。数の最小の因数がその数であるとき、あなたは最大の素因数を見つけました!
詳細なアルゴリズムの説明:
これを行うには、次の3つの変数を保持します。
因数分解しようとしている数(A)現在の除数ストア(B)最大の除数ストア(C)
最初に、(A)を関心のある数値とします。この場合は600851475143です。次に(B)を2とします。(A)が(B)で割り切れるかどうかをチェックする条件を設定します。除算可能な場合は、(A)を(B)で除算し、(B)を2にリセットして、(A)が(B)で除算できるかどうかの確認に戻ります。それ以外の場合、(A)が(B)で割り切れない場合は、(B)を+1でインクリメントしてから、(A)が(B)で割り切れるかどうかを確認します。(A)が1になるまでループを実行します。返される(3)は、600851475143の最大の素数除数になります。
これをより効果的にする方法はたくさんあります。次の整数にインクリメントする代わりに、次の必然的に素数の整数にインクリメントできます。最大の除数ストアを保持する代わりに、除数が唯一の場合に現在の数値を返すことができます。自体。ただし、上記のアルゴリズムは、関係なく数秒で実行されます。
Pythonでの実装は次のとおりです。-
def lpf(x):
lpf = 2;
while (x > lpf):
if (x%lpf==0):
x = x/lpf
lpf = 2
else:
lpf+=1;
print("Largest Prime Factor: %d" % (lpf));
def main():
x = long(raw_input("Input long int:"))
lpf(x);
return 0;
if __name__ == '__main__':
main()
例:上記の方法を使用して、105の最大の素因数を見つけましょう。
(A)= 105とします。(B)= 2(常に2から開始します)、(C)の値はまだありません。
(A)は(B)で割り切れますか?いいえ。(B)を+1でインクリメントします:(B)=3。(A)は(B)で割り切れますか?はい。(105/3 = 35)。これまでに見つかった最大の除数は3です。(C)= 3とします。更新(A)= 35。リセット(B)=2。
さて、(A)は(B)で割り切れますか?いいえ。(B)を+1でインクリメントします:(B)=3。(A)は(B)で割り切れますか?いいえ。(B)を+1でインクリメントします:(B)=4。(A)は(B)で割り切れますか?いいえ。(B)を+1でインクリメントします:(B)=5。(A)は(B)で割り切れますか?はい。(35/5 = 7)。以前に見つけた最大の除数は(C)に格納されています。(C)は現在3です。5は3より大きいため、(C)= 5を更新します。(A)=7を更新します。(B)=2をリセットします。
次に、(A)のプロセスを繰り返しますが、7は素数であり、それ自体と1以外の除数がないため、(B)=(A)まで(B)をインクリメントし続けます。 )>((A)/ 2)、数値の半分を超える整数の約数を持つことはできないため、任意の数の可能な最小の約数(1以外)は2です!)
したがって、その時点で(A)=7を返します。
これらのいくつかを手作業で試してみてください。そうすれば、アイデアのコツをつかむことができます。