場合の数を減らした場合
プログラムは読みにくくなりますが、処理時間は短くなります。
!覆面算
! 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
|