へたっぴpythonista

ド素人pythonistaとして、日々の学習成果や気づいたことについて書きます。

ProjectEuler21で解く

problem21

d(n) を n の真の約数の和と定義する. (真の約数とは n 以外の約数のことである. )
もし, d(a) = b かつ d(b) = a (a ≠ b のとき) を満たすとき, a と b は友愛数(親和数)であるという.

例えば, 220 の約数は 1, 2, 4, 5, 10, 11, 20, 22, 44, 55, 110 なので d(220) = 284 である.
また, 284 の約数は 1, 2, 4, 71, 142 なので d(284) = 220 である.

それでは10000未満の友愛数の和を求めよ.

 

 

・・・「友愛」ってフレーズがなんだか懐かしいですね。

 

失敗1

f:id:ruriohead:20130624160742p:plain

これを走らせると結果は40284となり、不正解でした。

問題文を読み返して気づいたのが、「10000未満の」友愛数であるということ。もしかしてsum1かsum2が10000以上になったのが原因かしらん?条件に加えてみよう。

失敗2

f:id:ruriohead:20130624161328p:plain

またしても合計は40284となり、不正解。・・・なぜだぁ。

 

 

・・・これって友愛数が自分自身ってパターンはないのかな?調べてみよう。

f:id:ruriohead:20130624162419p:plain

このコードでチェックしたところ、6,28,496,8128が該当することがわかった。これが間違いの原因だったのか!

というわけで解答

解答

f:id:ruriohead:20130624162656p:plain

で答え31626をようやく得ることができました。