| 元の数値 |
最大 |
最小 |
差 |
| 397 | 973 | 379 | 594 |
| 594 | 954 | 459 | 495 |
| 495 | 954 | 459 | 495 |
整数の桁を並べ替えて、最大にしたもの
から最小にしたものの差を取る。
この操作によって一回目に元の値に等しくなる数を カプレカ定数(Kaprecar's constant) と 定義します。
Dim 中止 As Boolean
Private Sub cmdGo1_Click()
'
' カプレカ数1を求める
'
Dim n As Long
Dim nl As Long, nr As Long
Dim r As Integer
Dim Ln As Integer
Dim i As Integer
Dim w() As String
Dim tmp1 As String, tmp2 As String
中止 = False
r = 0
n = 1
Range(Range("RESULT1"), Range("RESULT1").End(xlDown)).ClearContents
Do
Ln = Len(CStr(n))
ReDim w(Ln - 1)
For i = 1 To Ln
w(i - 1) = Mid(CStr(n), i, 1)
Next i
MySort w, 1
tmp1 = "": tmp2 = ""
For i = 1 To Ln
tmp1 = tmp1 & w(i - 1)
tmp2 = tmp2 & w(Ln - i)
Next i
nl = Val(tmp1)
nr = Val(tmp2)
If n = (nl - nr) Then
r = r + 1
Range("RESULT1").Cells(r, 1) = n
End If
n = n + 1
If n Mod 10000 = 0 Then
Range("COUNTER1").Value = n
DoEvents
End If
Loop While Not 中止
End Sub
Private Sub MySort(ByRef w() As String, Order As Integer)
'
' ソート: Order:1 昇順 -1:降順
'
Dim i As Integer, k As Integer
Dim tmp As String
Dim LB As Integer '配列の最小
Dim UB As Integer ' 最大
LB = LBound(w): UB = UBound(w)
For i = LB + 1 To UB
For k = i To LB + 1 Step -1
If Order * StrComp(w(k), w(k - 1)) > 0 Then
tmp = w(k - 1)
w(k - 1) = w(k)
w(k) = tmp
End If
Next k
Next i
End Sub
Private Sub cmdStop1_Click()
中止 = True
End Sub
Dim 中止 As Boolean
Private Sub cmdGo2_Click()
'
' カプレカ数2を求める
'
Dim n As Long, n2 As Currency
Dim nl As Long, nr As Long
Dim r As Integer, c As Integer
Dim Ln As Integer
Dim i As Integer
中止 = False
r = 0: c = 1
n = 45
Range(Range("RESULT2"), Range("RESULT2").End(xlDown)).ClearContents
Do
n2 = CCur(n) * CCur(n)
Ln = Len(CStr(n2))
nl = Val(Left(CStr(n2), Int(Ln / 2)))
nr = Val(Right(CStr(n2), CInt(Ln / 2)))
If n = (nl + nr) Then
r = r + 1
If r > 20 Then
r = 1
c = c + 1
End If
Range("RESULT2").Cells(r, c) = n
End If
n = n + 1
If n Mod 100000 = 0 Then
Range("COUNTER2").Value = n
DoEvents
End If
Loop While (Not 中止) And (n <= 3 * 10 ^ 7)
End Sub
Private Sub cmdStop2_Click()
中止 = True
End Sub
この予想の証明はまだされていませんが、この問題は多くの数学者が直感的に正しいと考えています。
現在、 3 × 253 = 27,021,597,764,222,976
までチェックされているそうです。
| 28から始めると下の表のようになり、 4,2,1のループとなる |
|
1〜30までの数字で開始したチャート いずれも、4,2,1のループになる ![]() |