challenge 最大公約数(除算禁止)

あなたが使っている言語で除算と剰余が使えなくなりました。

以下の条件のもと最大公約数を求めるプログラムを書いてください。

条件

  • 除算および剰余の使用禁止
  • 加算や乗算から除算・剰余を単純に定義することも禁止とする
  • ただし, ビットシフトが面倒な場合には引数を2で割った商を返す関数を実装しても構わない
  • 多倍長演算をサポートすること(各言語のライブラリ状況を見たいので)
  • 引数は2つの正整数と仮定して構わない
  • F_1=1, F_2=1のフィボナッチ数列で2000番目と1999番目の最大公約数を求めたときのループ回数を教えてください

Posted feedbacks - Ruby

2数の差が大きい時もわりと早く収束するかな。 結果[1, 3994]

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
require "mathn"

class Fib
  def initialize
    @fib_a=[1,1]
  end
  def [](n)
    (@fib_a.size..n).each{|i| @fib_a<<=@fib_a[i-2]+@fib_a[i-1]}  
    @fib_a[n-1]
  end
end

def gcd(n,m)
  c=0
  until(n==m)
    n,m=m,n if n<m
    return [1,c] if m==1
    m1=m
    while(m1<n)
      m1<<=1
      c+=1       
    end
    m1>>=1
    n-=m1
    c+=1
  end
  [n,c]
end

fib=Fib.new
p gcd(fib[2000],fib[1999])

Index

Feed

Other

Link

Pathtraq

loading...