ログイン
編集不可のページディスカッション情報添付ファイル
"iz/競技プログラミング/Project Euler 021 Amicable numbers"の差分

MMA
1と2のリビジョン間の差分
2012-12-21 10:10:38時点のリビジョン1
サイズ: 554
編集者: iz
コメント:
2012-12-21 10:18:40時点のリビジョン2
サイズ: 584
編集者: iz
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 8: 行 8:
#!/usr/bin/env ruby
行 11: 行 13:
  ret = 0
  
1.upto(n-1) do |i|
    if n % i == 0
      ret += i
  return @cache[n] = (1...n).inject do |a, p|
    if n % p == 0 
      a + p
    else
      a
行 17: 行 20:
  return @cache[n] = ret
行 29: 行 31:

http://projecteuler.net/problem=21

10000以下の友愛数の和を求める。

現実的な時間で全探索できる(計算量O(10^8))。一瞬では終わらない。

   1 #!/usr/bin/env ruby
   2 
   3 @cache = {}
   4 def divisors_sum(n)
   5   return @cache[n] if @cache[n]
   6   return @cache[n] = (1...n).inject do |a, p|
   7     if n % p == 0 
   8       a + p
   9     else
  10       a
  11     end
  12   end
  13 end
  14 
  15 ret = 0
  16 1.upto(10000) do |i|
  17   (i+1).upto(10000) do |j|
  18     if divisors_sum(i) == j && divisors_sum(j) == i
  19       ret += i + j
  20     end
  21   end
  22 end
  23 p ret

iz/競技プログラミング/Project Euler 021 Amicable numbers (最終更新日時 2012-12-21 10:18:40 更新者 iz)