新しく発言する  EXIT  インデックスへ

覆面算をプログラムで解く


  覆面算をプログラムで解く 山中和義 2008/06/07 21:11:59  (修正1回)
覆面算をプログラムで解く  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/06/07 21:11:59 ** この記事は1回修正されてます
! SEND  9567
!+ MORE  1085
!------
! MONEY 10652

DIM p(8) !文字SENDMORY ※異なる文字の数
MAT p=ZER

PUBLIC NUMERIC ANSWER_COUNT !解答数
LET ANSWER_COUNT=0

LET t0=TIME
CALL perm(p,1)
PRINT "計算時間=";TIME-t0

END


EXTERNAL SUB perm(p(), l) !nPr順列での数の組を生成する
FOR j=0 TO 9 !0〜9の数字
FOR k=1 TO l-1 !重複なし ※文字が異なれば数字も異なる
IF j=p(k) THEN EXIT FOR
NEXT k
IF k>l-1 THEN
LET p(l)=j !仮に

IF l=UBOUND(p) THEN !すべてが確定したら、式を検証する

LET v1= p(1)*1000+p(2)*100+p(3)*10+p(4) ! SEND
LET v2= p(5)*1000+p(6)*100+p(7)*10+p(2) ! MORE
LET v3=p(5)*10000+p(6)*1000+p(3)*100+p(2)*10+p(8) !MONEY
IF v1+v2=v3 THEN !式が成立するなら

LET ANSWER_COUNT=ANSWER_COUNT+1 !解答数
PRINT ANSWER_COUNT

PRINT USING " SEND ####":v1 !結果の表示
PRINT USING "+ MORE ####":v2
PRINT "-------"
PRINT USING " MONEY #####":v3
PRINT

END IF
ELSE
CALL perm(p,l+1) !次の文字へ
END IF

END IF
NEXT j
END SUB



!例1
!DIM p(7) !文字 ※異なる文字の数

!LET v1= p(1)*1000+p(2)*100+p(3)*10+p(4) ! BASE
!LET v2= p(1)*1000+p(2)*100+p(5)*10+p(5) ! BALL
!LET v3=p(6)*10000+p(2)*1000+p(7)*100+p(4)*10+p(3) !GAMES
!IF v1+v2=v3 THEN !式の成立するなら
! LET ANSWER_COUNT=ANSWER_COUNT+1 !解答数
! PRINT ANSWER_COUNT
!
! PRINT USING " BASE ####":v1 !結果の表示
! PRINT USING "+ BALL ####":v2
! PRINT "-------"
! PRINT USING " GAMES #####":v3
! PRINT
!END IF



!例2
!LET v1= p(1)*10000+p(2)*1000+p(2)*100+p(3)*10+p(4) ! WOODS
!LET v2=p(5)*100000+p(2)*10000+p(6)*1000+p(7)*100+p(4)*10+p(8) !FOREST
!IF v1+v1+v1=v2 THEN !式の成立するなら
! LET ANSWER_COUNT=ANSWER_COUNT+1 !解答数
! PRINT ANSWER_COUNT
!
! PRINT USING " WOODS #####":v1 !結果の表示
! PRINT USING " WOODS #####":v1
! PRINT USING "+ WOODS #####":v1
! PRINT "--------"
! PRINT USING " FOREST ######":v2
! PRINT
!END IF
  場合の数を減らした場合 山中和義 2008/06/08 14:31:17  (修正1回)
  面白いですね 島村1243 2008/06/16 07:36:15 

 インデックスへ  EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。