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 - D

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import std.conv;
import std.math;
import std.string;

uint goedel(uint n) {
        static int[] primes = [ 2, 3 , 5, 7, 11, 13, 17, 19, 23, 29 ];
        real rslt = 1;
        string str = toString(n);
        for (int i = 0; i < str.length; ++i) {
                rslt *= pow(cast(real)(primes[i]), toUint([str[i]]));
        }
        return cast(uint)(rslt);
}

/*
import std.stdio;

void main() {
        writefln("%d, %d, %d", 9, 512, goedel(9));
        writefln("%d, %d, %d", 81, 768, goedel(81));
        writefln("%d, %d, %d", 230, 108, goedel(230));
}
*/

Index

Feed

Other

Link

Pathtraq

loading...