虫食い算
さてさて、今回はパズルに挑戦してみましょう。
パズルというのは人間が考えて解く問題です。
人間ならではというような思考をどのようにしてコンピュータに取り入れるか?
今回はそこが課題になってきます。
さて、人間の思考をコンピュータに。
難しそうに聞こえますが、そんなに難しくはないです。
(非難が聞こえてきそうですが)
まずは、パズルの問題です。
□□□□□
× □□□
――――――
□4□□□
□□4□□
□□□4□
――――――――
1□□□□444
若干ずれてるのは気にしないで下さい。
さて、これを人間にやれと言われても、
解ける人はわずかでしょう(出来ない事はない)
こういう問題だからコンピュータに解かせようってわけです。
ではまず考え方を。
与えられた情報から何が得られるかを考えてみましょう。
まず最初の5桁の数字をaとします。そして、次の3桁の数字をbとします。
bの一の位、十の位、百の位をb0、b1、b2とします。
同様に、1□□□□444をcとして、
□4□□□をc0、□□4□□をc1、□□□4□をc2とする。
ここから考えられる事を列挙していきましょう。
1.aは5桁
2.bは3桁
3.c0=a×b0
4.c1=a×b1
5.c2=a×b2
6.b=b2×100+b1×10+b0
7.c=a×b
8.途中に4があるのでbには0は入らない
ここまでは誰でも思いつきますよね。
さて、ここから求めていくための条件が出てきます。
条件1.c0は5桁以下の数で、千の位が4
条件2.c1は4桁以下の数で、百の位が4
条件3.c2は4桁以下の数で、十の位が4
条件4.cは8桁の数で、初めが1、下3桁が444である。
これがこの問題を解くタメの条件になります。
さて、それではプログラムをどうやって書けばいいか、
まずは流れを書いてみましょう。
function quiz1 % % 虫食い算解答プログラム % 擬似プログラミング % 第一版 % aが10000〜99999まで繰り返す b0が1〜9まで繰り返す c0=a×b0 条件1 b1が1〜9まで繰り返す c1=a×b1 条件2 b2が1〜9まで繰り返す c2=a×b2 条件3 c=c2×100+c1×10+c0 条件4 答えが求まる |
function quiz1 % % 虫食い算解答プログラム % 擬似プログラミング % 第二版 % for a = 10000 : 99999 for b0 = 1 : 9 c0 = a * b0; 条件1 for b1 = 1 : 9 c1=a*b1; 条件2 for b2 = 1 : 9 c2 = a * b2; 条件3 c = 100 * c2 + 10 * c1 + c0; 条件4 答えが求まる end end end end |
c0 < 100000 |
if c0 < 100000 |
c0 / 1000 |
mod(a,b) |
mod((c/1000),10) |
floor(mod((c/1000),10)) |
floor(mod((c/1000),10))==4 |
if c<100000 & floor(mod((c/1000,10))==4 |
if c<100000 & floor(mod((c/100,10))==4 |
if c<100000 & floor(mod((c/100,10))==4 |
if floor(c/10000000)==1 & floor(mod(c,1000))==444 |
function quiz1 % % 虫食い算解答プログラム % 第三版 % for a = 10000 : 99999 for b0 = 1 : 9 c0 = a * b0; if c<100000 & floor(mod((c/1000,10))==4 for b1 = 1 : 9 c1=a*b1; if c<100000 & floor(mod((c/100,10))==4 for b2 = 1 : 9 c2 = a * b2; if c<100000 & floor(mod((c/100,10))==4 c = 100 * c2 + 10 * c1 + c0; if floor(c/10000000)==1 & floor(mod(c,1000))==444 fprintf('aは%d bは%d%d%d',a,b2,b1,b0); end end end end end end end end |