Project Euler 38
192を1, 2, 3で掛けてみよう. 192 × 1 = 192 192 × 2 = 384 192 × 3 = 576 積を連結することで1から9のPandigital数 192384576 が得られる. 192384576を 192と(1,2,3)の連結積と呼ぶ. 同じようにして, 9を1,2,3,4,5と掛け連結することでPandigital数918273645が得られる. これは9と(1,2,3,4,5)との連結積である. 整数と(1,2,...,n) (n > 1) との連結積として得られる9桁のPandigital数の中で最大のものを答えよ.
(* xと (1,2,...,n)の連結積 *) cProduct[x_, n_] := Module[{nList, productedList, ret}, nList = Range[n]; productedList = Map[x * # &, nList]; ret = FromDigits[Flatten[Map[IntegerDigits[#] &, productedList]]]; Return[ret]; ] (* pandigital数かどうか *) isPandigital[x_] := If[Sort[IntegerDigits[x]] == Range[9], True, False]; num = 0; For[i = 1, i < 10000, i++, For[n = 2, n <= 9, n++, tmp = cProduct[i, n]; If[! isPandigital[tmp], Break[]]; If[tmp > num, num = tmp]; ] ] num
問題のconditionがかなりめんどくさいので、連結数を返す関数とPandigital数かどうかを判定する関数をそれぞれ作成。
計算速度も結構いい感じです。