パズル万華鏡

面白いパズルの紹介と解説をします。

不思議な掛算問題・考察(1)

 不思議な掛算問題・考察(1)を紹介します。

考察(1)
 相異なるm個の数字を用いて、k(1≦k≦[m/2])個の数字からなる数値とm-k個の数字からなる数値の積が、同じm個の数字で表されるものを求めよ。


f:id:isemba:20151003113028j:plain
●プログラム(MM121.bas)

' << MM121.bas >>
' Tiny Basic
'
Dim A(9): ' A(J)=0は、左辺で数字Jが出現していないことを意味し、
          ' A(J)=1は、左辺で数字Jが出現したことを意味する。
Dim B(9): ' 作業用配列。
'
' 桁数Mについて調べる。
For M=2 To 5
  '
  Print: Print M;"個の数字"
  N0=10^(M-1)
  N1=10^M-1: ' M桁で最大値。
  '
  ' M桁の整数について解の探索。
  COUNT=0: ' 解の個数。
  For N=N0 To N1
    ' 初期設定。
    For J=0 To 9: A(J)=0: Next J 
    '
    S=N
    ' 変数Sの値を各桁に分解していく。数字に重複があればスキップ。
    While S > 0 
      W=S Mod 10
      If A(W) > 0 Then Goto *Lab 
      A(W)=A(W)+1: S=Int(S/10)
    Wend
    '
    ' 変数Nの値をタイプに分解する。
    For K=1 To Int(M/2) 
      T1=Int(N/10^K): T2=N Mod 10^K: 
      For J=0 To 9: B(J)=A(J): Next J
      '
      T=T1*T2
      ' 変数Tの値を各桁に分解していく。
      L=0
      While T > 0 
        W=T Mod 10
        If B(W) = 0 Then Exit Do
        B(W)=B(W)-1
        T=Int(T/10)
        L=L+1
      Wend
      '
      ' 解の表示。
      If L = M Then                                
        If T1 >= T2 Then
          COUNT=COUNT+1                              
          Print Using"(####) ";COUNT;                
          Print T1;"×";T2;"=";T1*T2       
        End If
      End If                       
    Next K                
  *Lab
  Next N
Next M
End

実行結果
f:id:isemba:20151003113213j:plain
f:id:isemba:20151003113230j:plain