正整数を変換する操作についての考察(1)を紹介します。
考察(1)
m桁の正整数a(1)に変換操作を行うと、つぎのような変換過程が考えられる。
●例 1,2,3
m=5について、変換過程を表示するプログラムはつぎのようになる。
●考え方
①配列要素A(N)(1≦N≦10m-1)に正整数Nに変換操作を1回行って得られる値を
保存する。
②正整数X(1≦X≦10m-1)からスタートして変換操作を続けたときの正整数の推移
(a(1)→a(2)→a(3)→…→a(i)→…→a(p)→a(p+1)→…→a(q))を配列Aを
活用して調べる。
③正整数a(i)の出現した順番iを配列B(a(i))に保存していき、2度目に
出現したとき、繰り返しの起点とする。
●プログラム(N6174b.bas)
' << N6174b.bas >> ' Tiny Basic ' Dim A(99999): ' A(N):正整数Nに変換操作を1回行って得られる値。 Dim B(99999): ' 変換操作で得られる正整数の順番を保存する配列。 Dim D(9): ' 正整数の各桁を保存する配列。 ' ' 桁数Mの設定。 M=5 ' N1=1: ' M桁の正整数の最小数。 N2=10^M-1: ' M桁の正整数の最大数。 ' ' 配列A(*)を求める。 For N=N1 To N2 ' T0=N: ' 変換操作前の正整数T0。 ' ' 整数Nを各桁に分解し、配列D(*)に保存。Kは桁数。 T=T0: K=0 While T > 0 K=K+1: D(K)=T Mod 10: T=Int(T/10) Wend ' Tが5桁未満の場合、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 ' A(T0)=T1 Next N ' ' 変換操作の状況を表示。 B(0)=0 For I=N1 To N2: B(I)=0: Next I ' Print M;"桁の正整数" For I=N1 To N2 Print Using" ##### ";I; X=I J=0: ' 変換操作の回数。 While B(X) = 0: J=J+1: B(X)=J Print Using"(##)##### ";J;X; If J Mod 5 = 0 Then Print: Print SPACE$(10); X=A(X) Wend Print Using"(##)#####";B(X);X ' ' 配列B(*)をリセット。 X=I: While B(X) > 0: B(X)=0: X=A(X): Wend Next I End
実行結果