GAIさんへのお返事です。
10個(ONETWFURSV)の変数に10個(0~9)の数字を割り当てるので、
「10個の数字を使ってできる順列」を生成して、式を確認すればよいでしょう。
場合の数は、comb(10,10)*10!=10!通り。
!覆面算 ※10個の変数の場合
LET t0=TIME
PUBLIC NUMERIC ANSWER_COUNT !解答数
LET ANSWER_COUNT=0
DIM a(10) !異なる文字 ※ONETWFURSVの順
FOR i=1 TO 10 !0~9
LET a(i)=i-1
NEXT i
CALL perm(a,1)
PRINT "計算時間=";TIME-t0
END
EXTERNAL SUB perm(a(), i) !n個の数字を使ってできる順列(辞書式でない)
LET N=UBOUND(a) !文字数
IF i<N THEN
FOR j=i TO N
LET t=a(i) !swap a(i),a(j)
LET a(i)=a(j)
LET a(j)=t
CALL perm(a,i+1)
LET t=a(i) !swap a(i),a(j)
LET a(i)=a(j)
LET a(j)=t
NEXT j
ELSE !すべてが確定したら、式を検証する
!!!MAT PRINT a; !debug
IF a(1)>0 AND a(4)>0 AND a(6)>0 AND a(9)>0 THEN !最上位桁は0でない
LET ONE = a(1)*100+a(2)*10+a(3)
LET TWO = a(4)*100+a(5)*10+a(1)
LET FOUR = a(6)*1000+ a(1)*100+a(7)*10+a(8)
LET SEVEN=a(9)*10000+a(3)*1000+a(10)*100+a(3)*10+a(2)
IF ONE+TWO+FOUR=SEVEN THEN !式が成立するなら
LET ANSWER_COUNT=ANSWER_COUNT+1 !解答数
PRINT ANSWER_COUNT
PRINT USING " ONE ####":ONE !結果の表示
PRINT USING " TWO ####":TWO
PRINT USING "+ FOUR ####":FOUR
PRINT "-------"
PRINT USING " SEVEN #####":SEVEN
PRINT
END IF
END IF
END IF
END SUB
実行結果
1
ONE 350
TWO 673
+ FOUR 9382
-------
SEVEN 10405
2
ONE 350
TWO 683
+ FOUR 9372
-------
SEVEN 10405
3
ONE 530
TWO 625
+ FOUR 9548
-------
SEVEN 10703
4
ONE 530
TWO 645
+ FOUR 9528
-------
SEVEN 10703
5
ONE 630
TWO 526
+ FOUR 9647
-------
SEVEN 10803
6
ONE 630
TWO 546
+ FOUR 9627
-------
SEVEN 10803
7
ONE 940
TWO 729
+ FOUR 8935
-------
SEVEN 10604
8
ONE 940
TWO 739
+ FOUR 8925
-------
SEVEN 10604
また、
SEND
+ MORE
-----
MONEY
の場合は、8個の変数(SENDMORY)に10個の数字を割り当てることになります。
「10個から8個を選ぶ組合せ」で数字を選択して、「その数字を使ってできる順列」での検証。comb(10,8)*8!通り。
上記プログラムは、そのテンプレートになると思いますので改修してみてください。
参考
フォルダ SAMPLE 内 PERMUTAT.BAS、COMBINAT.BAS