[ 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) ができるはずです。
あれこれ試した結果は:
[ 湯会老人のコメント ]
私はこういう場合 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: 円錐山の遊歩 ]
|