パズル万華鏡

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

正整数を変換する操作についての考察(3)

 正整数を変換する操作についての考察(3)を紹介します。

考察(3)

 考察(2)で、m桁の正整数a(1)に変換操作を行い、
f:id:isemba:20150905093052j:plain
を得たとき、m(2≦m≦7)について、繰り返しの起点となる値a(p),a(1)はつぎのようになることがわかった。
f:id:isemba:20150905093122j:plain
 しかし、詳細に変換操作を調べると、それぞれのm(2≦m≦7)について、収束していくループ(a(p)→a(p+1)→…→a(q)→a(p))がいくつかあることがわかった。
f:id:isemba:20150905093156j:plain
 m桁の正整数について、ループを探索するプログラムはつぎのようになる。

●考え方

 繰り返しの起点からスタートするループを求め、得られた結果から重複を除く。

●プログラム(N6174d.bas)

' << N6174d.bas >> 
' Tiny Basic
'
' ループの探索。
'
Dim D(9): ' 正整数の各桁を保存する配列。
'
For M=2 To 7
  Print Using"桁数=#";M
  Do                                                       
    Read N                                                 
    If N <= 0 Then Exit Do                                 
    '                                                      
    T0=N: ' 変換操作前の正整数T0。                         
    Print T0;                                               
    '                                                      
    *Lab                                                   
    ' 整数Nを各桁に分解し、配列D(*)に保存。Kは桁数。       
    T=T0: K=0                                              
    While T > 0                                            
      K=K+1: D(K)=T Mod 10: T=Int(T/10)                    
    Wend                                                   
    ' TがM桁未満の場合、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                                           
    Print T1;                                              
    '                                                      
    If T1 <> N Then T0=T1: Goto *Lab                       
    Print                                                  
  Loop                                                     
Next M
'
' データ。
' 2桁の整数における、繰り返しの起点。
Data 9, 27, 45, 63, 81, 0
' 3桁の整数における、繰り返しの起点。
Data 495, 0
' 4桁の整数における、繰り返しの起点。
Data 6174, 0
' 5桁の整数における、繰り返しの起点。
Data 53955, 59994, 61974, 62964, 63954, 71973, 74943, 
Data 75933, 82962, 83952,0
' 6桁の整数における、繰り返しの起点。
Data 420876, 549945, 631764, 642654, 750843, 840852,
Data 851742, 860832, 862632, 0
' 7桁の整数における、繰り返しの起点。
Data 7509843, 7519743, 7619733, 8429652, 8439552,
Data 8649432, 8719722, 9529641, 0

実行結果
f:id:isemba:20150905093348j:plain
f:id:isemba:20150905093402j:plain