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

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


  覆面算をプログラムで解く 山中和義 2008/06/07 21:11:59  (修正1回)
  場合の数を減らした場合 山中和義 2008/06/08 14:31:17  (修正1回)
Re: 覆面算をプログラムで解く  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/06/08 14:31:17 ** この記事は1回修正されてます
場合の数を減らした場合

プログラムは読みにくくなりますが、処理時間は短くなります。



!覆面算

! SEND  9567
!+ MORE  1085
!------
! MONEY 10652

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

PUBLIC NUMERIC ANSWER_COUNT !解答数
LET ANSWER_COUNT=0

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

END


EXTERNAL FUNCTION fig(x,n) !n桁目の数を得る ※0:一の位、1:十の位、2:百の位、…
LET fig=MOD(INT(x/10^n),10)
END FUNCTION

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=v1+v2 !MONEY

IF fig(v3,4)=p(5) THEN !M----
IF fig(v3,3)=p(6) THEN !-O---
IF fig(v3,2)=p(3) THEN !--N--
IF fig(v3,1)=p(2) THEN !---E-
LET c=fig(v3,0) !----Y
FOR k=1 TO l !重複なし ※文字が異なれば数字も異なる
IF c=p(k) THEN EXIT FOR
NEXT k
IF k>7 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
END IF
END IF
END IF
END IF
ELSE
CALL perm(p,l+1) !次の文字へ
END IF

END IF
NEXT j
END SUB
  面白いですね 島村1243 2008/06/16 07:36:15 

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