challenge 正整数のゲーデル数化?

正の整数 n を引数としてとり, 2^d1 * 3^d2 * 5^d3 ... * pk^dk を返す関数
goedel を定義してください.

ただし,n を10進表現で k 桁の数としたときの各桁の数が数列 [d1,d2,d3,...,dk]
をなすとし,dk が 1 の位,d1 が 10^(k-1) の位です.また,pk は k番目の素数です.

goedel   9  ⇒ 2^9             ⇒  512
goedel  81  ⇒ 2^8 * 3^1       ⇒  768
goedel 230  ⇒ 2^2 * 3^3 * 5^0 ⇒  108

Posted feedbacks - Java

とりあえず,「仕様バグ」は無視して題意どおりの実装。

$ java Goedel 230
108

$ java Goedel 123456789
52713275010243038997421106186697438702252144407250
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import java.math.BigInteger;
import java.util.Vector;

public class Goedel {
    private static final int CERTAINTY = 24;
    public static void main(String[] args) throws Exception {
        Vector<BigInteger> primes = new Vector<BigInteger>();
        for (int i = 2; primes.size() < args[0].length(); i++) {
            BigInteger bi = BigInteger.valueOf(i);
            if (bi.isProbablePrime(CERTAINTY)) primes.add(bi);
        }
        BigInteger result = BigInteger.ONE;
        for (int i = 0; i < args[0].length(); i++)
            result = result.multiply(primes.get(i).pow(Integer.valueOf(args[0].substring(i,i+1))));
        System.out.println(result);
    }
}

Index

Feed

Other

Link

Pathtraq

loading...