正整数を変換する操作についての考察(3)を紹介します。
考察(3)
考察(2)で、m桁の正整数a(1)に変換操作を行い、
を得たとき、m(2≦m≦7)について、繰り返しの起点となる値a(p),a(1)はつぎのようになることがわかった。
しかし、詳細に変換操作を調べると、それぞれのm(2≦m≦7)について、収束していくループ(a(p)→a(p+1)→…→a(q)→a(p))がいくつかあることがわかった。
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
実行結果