これは私のコードです。
!/usr/bin/python
primes = [2]
def fp():
i=3
while i<10000:
for j in primes:
if i%j == 0:
break
else:
primes.append(i)
i+=1
def fac(n):
f={}
i = 0
while n > 1:
p=primes[i]
if p*p > n :
p=n
while n%p==0:
f[p]=f.get(p,0)+1
n/=p
i+=1
n=1
for i in f:
n*=f[i]+1
return n
from time import time
def f1():
t=time()
fp()
j=0
i=0
max = 0
while True:
i+=1
j+=i
f=fac(j)
if f >= 500:
break
print j,f
print time()-t
f1()
EDITED:
素数:(FPによって構築された)最後の素数少ないより10000
FP 2〜素数を含むリストは、:10000より小さいすべての素数を見つけますそれらを「素数」に格納します。この後に素数を何度もチェックしなければならないので、事前に見つけてリストに格納することで全体の処理が速くなります。この関数は高速です。1.素数2だけを通過します。これは、ターゲット番号のsqrtで停止します。
fac:与えられた数のファクタの数を資金提供するファンクション。ブルートフォースよりも優れているのは、「素数」リストを使用してすべての素因数を見つけようとしているからです。目標数のsqrtで停止します。すべての素数を知った後、異なる素数の数の乗算である何らかの組合せアルゴリズムを使用して、因子の数を計算します。
例:40 =(2 * 2 * 2)(5)次いで、40(3(+1))(1(+1))= 8因子
説明している:あなたが考えることができ2つのマテリアルグループ(この例では2と5)があり、これらのマテリアルを混合することによって得られる結果の数を見つけたいという問題があります。マテリアル '2'に焦点を当てれば、2を得るためには '2'を1つだけ選択し、4を得るには2を、2を得るには2を選択することができます。 3回発生する素因数から+1の可能性。 '5'と同じですが、あなたはそれを選択したり選択を解除することで1 +1の可能性があります。それは(+1)が来る方法です。
f1:主な機能。次の三角形の数にジャンプし、500以上の要素を持つものを見つけて停止し、時間を印刷します。
1つは、三角形の数字をチェックしていないため、すべての奇数をチェックしています。 'count + count + 1'を' count'で1ずつ増加させると、シーケンス1,3,5,7,9などが返されます。 –
1からxまでの要素をチェックする必要はありません。 'n'が因子の場合、' x/n'も因子になります。したがって、 'sqrt(x)'までチェックするだけです。 – kennytm
2人の場合、ブルートフォーストライアル部門よりも多くの要素を得るより早い方法を考える必要があります。これは、プログラムを最適化する巧妙な方法を考え出すために、すべてのProject Euler問題の目的です。目標は、問題を解決するだけでなく、問題をすばやく解決することです。私はあなたに助けを求めないことを強く勧めます。これ以上いくつか作業して、自分で考えてください。それはそれに値するだろう。 –