パズル万華鏡

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

正整数を変換する操作についての問題(1)の解

 正整数を変換する操作についての問題(1)の解答例を示します。

問題(1)の解

 同じ数字からなる4桁の数以外の正整数から始めると、6174になることが知られている。同じ数字からなる4桁の数では、変換操作で0になる。

 4桁の正整数について、変換操作を続けると6174になることを確認する。
ただし、4桁未満の正整数について、先頭に0を追加して(たとえば、12は0012とする)4桁と見なす。

 変換過程を実行するプログラムはつぎのようになる。

●プログラム(N6174a.bas)

' << N6174a.bas >> 
' Tiny Basic
'
' 4桁の正整数について、変換操作を続けると6174になることを
' 確認する。
' 
Dim D(9):  ' 正整数の各桁を保存する配列。
'
' 桁数Mの設定。
M=4
'
N1=1:      ' M桁の正整数の最小数。
N2=10^M-1: ' M桁の正整数の最大数。
'
Print M;"桁の正整数"
For N=N1 To N2
  '
  T0=N: ' 変換操作前の正整数T0。
  '
  Print T0;
  Do
    '
    ' 整数T0を各桁に分解し、配列D(*)に保存。Kは桁数。
    T=T0: K=0 
    While T > 0 
      K=K+1: D(K)=T Mod 10: T=Int(T/10)
    Wend
    ' Tが4桁未満の場合、0を補う。
    While K < M: K=K+1: D(K)=0: Wend
    ' 
    ' 配列D(*)の要素を昇順に並べる。
    For I=K To 1 Step -1
      For J=1 To I-1
        If D(J) > D(J+1) Then
          W=D(J): D(J)=D(J+1): D(J+1)=W
        End If
      Next J
    Next I
    '
    ' 最大数MAXNを求める。
    MAXN=0 
    For I=K To 1 Step -1: MAXN=MAXN*10+D(I): Next I
    '
    ' 最小数MINNを求める。
    MINN=0 
    For I=1 To K: MINN=MINN*10+D(I): Next I
    '
    ' 変換操作後の正整数T1:最大値-最小値
    T1=MAXN-MINN
    '
    If (T1 = 0) Or (T0 = T1) Then Print: Exit Do
    Print"→";T1;
    T0=T1
  Loop
Next N
End

実行結果
f:id:isemba:20150905091627j:plain
 実行結果から、1以上9999以下の正整数について、4個の数字が同じ場合を除き、6174になることを確認した。
f:id:isemba:20150905091705j:plain