[ 0002: 不思議な9桁の整数 ]


[ 湯会老人の出題 ]

1 から 9 までの数字を一つずつ使って、
次の条件を満たす 9 桁の整数を作ってください。

上位 n 桁を取り出した数は、n で割り切れる。(n は 1 から 9 まで)

こういう数は 1 個しかありません。見つかるかな?


[ 千手春弥さんの回答 ]

上位桁から順に n1, n2, n3, n4, n5, n6, n7, n8, n9 としましょう。

  • まず、n5 は 5 で確定。

  • n2, n4, n6, n8 は偶数、 すなわち {2, 4, 6, 8} の中の数になる。

  • * 4 個の数で 4 個の偶数を使い切るため、n1, n3, n7, n9 は残った {1, 3, 7, 9} の中から。

  • 100 は 4 で割りきれるため、上位 4 桁での n1, n2 はどの数でもよい。 n3 が {1, 3, 7, 9} ならば、n4 は {2, 6}。

  • 上位 3 桁が 3 で割り切れ、上位 6 桁が 6 で割り切れるためには、 n1 + n2 + n3 も n4 + n5 + n6 も 3 で割り切れる必要がある。 n5 は既に 5 で確定しているので、n4 を仮に 6 にすれば、 6 は 4 しかない。

  • 上位 7 桁が 7 の倍数になるには:
    (n1 + n5n6n7) - n2n3n4 が 7 で割り切れる。

こうやって絞り込んでゆきますと、
実質的に 24 とおりあたりまで絞り込み (screening) ができるはずです。
あれこれ試した結果は:

381654729


[ 湯会老人のコメント ]

私はこういう場合 Perl スクリプトを書いて、即実行します。 次のようなものですね。 本当は (1,2,3,4,5,6,7,8,9) の順列 (362880 とおり) を利用したほうが 効率がいいのですが。気が向いたら書き直します。

#!/usr/local/bin/perl

for ($n=123456789; $n<=987654321; $n++) {
 $s = sprintf("09d", $n);
 %d = split(//, $s);
 %c = (); # チェックマーク用。
 for ($i=0; $i<9; $i++) {
  goto NG if ($d[$i] == '0'); # 0を含む数字はNG。
  goto NG if ($c[$i] == '1'); # 重複した桁を持つ数字はNG。
  $c[$i] = '1'; # 一度あらわれた桁の数にチェックマークをつける。
 }
 for ($i=0; $i<9; $i++) {
 # 上位($i+1)桁をとった数が($i+1)で割り切れなければNG。
  goto NG unless (int($n/10^(8-$i)) % ($i+1) == ($i+1));
 }
 print ("Magic number: $n\n"); # 生き残った数を書き出す。

 next;
NG: ;
}

[ 改訂版 ] ⇒ 0170 (順列機能を使用)


[ 浅見多絵さんのコメント ]

なるほど。結構簡単に書けますね。
私も今度機会があったらやってみようかしら。 しかし、プログラムにやらせるのはズルいかも。 (笑)

[ 0021: 次の記事 ]

[ 0020: 3個の奇数の和が偶数? ]

[ 0019: 男女比はどうなるか? ]

[ 0018: 2本の線で領域分断 ]

[ 0017: 超簡単なMIT入試問題 ]

[ 0016: 風車三角形の面積合計 ]

[ 0015: ピッタリの球のサイズ ]

[ 0014: 三重盗2度成功の鈍足 ]

[ 0013: いま何時何分? ]

[ 0012: 正方形の辺の長さは? ]

[ 0011: 鶴亀蛸算 ]

[ 0010: 先手が生き残る確率 ]

[ 0009: また、青い三角形の面積 ]

[ 0008: 青い三角形の面積 ]

[ 0007: 和音の周波数比 ]

[ 0006: パチンコ玉は何個はいる? ]

[ 0005: ドミノ式数学的帰納法 ]

[ 0004: 円周率は3.05より大きい ]

[ 0003: Ramanujanの入れ子式 ]

[ 0002: 不思議な9桁の整数 ]

[ 0001: 円錐山の遊歩 ]

[ トップページへ ]