問題23は、「2つの豊富な数値の和ではない」すべての数値の合計を求めています。 1 + 2 + 3 + 4 + 6 = 16> 12であるため、n-12が最初の豊富な数である場合、整数nは豊富です。これにより、24 2つの豊富な数字の合計である最小の数字です。したがって、合計から除外したいと考えています。プロジェクトオイラー23 - 私の答えは大きすぎます
import math
def divisors_of(n):
divs=[1]
for i in range(2,int(math.sqrt(n))+1):
if i**2 == n:
divs.append(i)
elif n%i == 0:
divs.append(i)
divs.append(n//i)
return divs
def is_abun(n):
return sum(divisors_of(n))>n
numbers=[i for i in range(1,28123)]
for i in numbers:
for j in range(1,i):
if is_abun(j) and is_abun(i-j):
numbers.remove(i)
break
print(sum(numbers))
アイデアです単にそのjとijはその後、コースのj個の+の過剰数が、ある場合(:
は、ここに私のpython私は、多くのバリエーションを試してみたコード、が、同じ考え方を使用しますij)= iは豊富な数字の合計ですので、数字のリストから削除します。残りのすべての数を合計します。これがどうして失敗するのか分かりません。しかし、結果は(別の情報源から得た)4179871でなければならないが、私は常に477倍以上の大きさの197711987の球場で何かを得る。
これが正しい結果を生成する方法を実際に理解できません。私が思っていることをしていない行があるはずですが、ここにあるものはすべてただ単純です私にはそれらの疑いがあります。私は多量の数値を計算する際に最も誤りがあると思っていましたが、私はほぼ完全にその部分が正しいと確信しています(28123未満の豊富な数値のリストを生成するコードを取得すれば、これは、WolframAlphaが28123以下の数の豊富な数字です)。
編集しました。 (以前は約5秒かかっていました!)これが唯一の問題であるかどうかはすぐにわかります。私は多くのバリエーションを試したと言いました。 1つはnumbers.remove(i)の代わりにnumbers [i] = 0でした。これは、あなたが言及したシフトを引き起こすことはありませんでしたが、私はまだ多かれ少なかれ同じ出力を持っていました。その場合何が起こったのでしょうか? – FireGarden
@FireGardenまあ、1つの簡単な方法は、不当な数を再計算することを避けることです。つまり、あなたのコードは 'is_abun(1)' *を何度も呼び出していて、 'is_abun(2)'にも同じことが言えます。これを高速化する簡単な方法は、豊富な数の集合を最初に計算することです: 'abundants = {i for i in range(1,28123)is_abun(i)}' 'とし、そのループの中で' is_abun(j) 'jは豊富に、(ij)は豊富に 'is_abun(ij)'とする。 – Bakuriu
@FireGardenこの 'abundants'セットでいくつの数が終了するかによって、すべての可能な合計を計算し、この値を' n'までのガウス合計から削除する方が速いかもしれません。 – Bakuriu