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

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

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

条件

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

Posted feedbacks - Java

既に #4790でも出てますが、Javaだと任意精度の整数値に対して使えるgcdがあるのでそれを使えます。

#4790 と同じなのもアレなので、フィボナッチ数列の計算処理もしてみました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.math.BigInteger;
import java.util.HashMap;
import java.util.Map;

public class Sample106 {
    private final Map<Integer, BigInteger> fibMemo_ = new HashMap<Integer, BigInteger>();

    public BigInteger getFibValue(int index) {
        if (index == 1 || index == 2) return BigInteger.ONE;
        BigInteger fib = fibMemo_.get(index);
        if (fib == null) {
            fib = getFibValue(index - 2).add(getFibValue(index - 1));
            fibMemo_.put(index, fib);
        }
        return fib;
    }

    public static void main(String[] args) {
        Sample106 instance = new Sample106();
        BigInteger fib1999 = instance.getFibValue(1999);
        BigInteger fib2000 = instance.getFibValue(2000);
        System.out.println(fib2000.gcd(fib1999));
    }
}

Index

Feed

Other

Link

Pathtraq

loading...