49 lines
1.2 KiB
Text
49 lines
1.2 KiB
Text
Function sort(s As String) As String
|
|
Dim As Uinteger i, j, n = Len(s)
|
|
Dim As String temp
|
|
|
|
For i = 1 To n
|
|
For j = i + 1 To n
|
|
If Asc(Mid(s, i, 1)) > Asc(Mid(s, j, 1)) Then
|
|
temp = Mid(s, i, 1)
|
|
Mid(s, i, 1) = Mid(s, j, 1)
|
|
Mid(s, j, 1) = temp
|
|
End If
|
|
Next j
|
|
Next i
|
|
|
|
Return s
|
|
End Function
|
|
|
|
Function rfind(c As String, s As String) As Uinteger
|
|
Return Instr(s, c)
|
|
End Function
|
|
|
|
Function nextHigh2(n As String) As String
|
|
Dim As Uinteger hi = Asc(Right(n, 1))
|
|
Dim As Uinteger i, ni, idx
|
|
Dim As String sr
|
|
|
|
For i = Len(n) - 1 To 1 Step -1
|
|
ni = Asc(Mid(n, i, 1))
|
|
If ni < hi Then
|
|
sr = sort(Mid(n, i))
|
|
idx = rfind(Chr(ni), sr) + 1
|
|
Mid(n, i, 1) = Mid(sr, idx, 1)
|
|
Mid(sr, idx, 1) = ""
|
|
Mid(n, i + 1) = sr
|
|
Return n
|
|
End If
|
|
hi = Iif(hi > ni, hi, ni)
|
|
Next i
|
|
|
|
Return "0"
|
|
End Function
|
|
|
|
Dim As String tests2(8) = { "0", "9", "12", "21", "12453", _
|
|
"738440", "45072010", "95322020", "9589776899767587796600" }
|
|
Dim As Double t1 = Timer
|
|
For i As Uinteger = 0 To Ubound(tests2)
|
|
Print tests2(i); " => "; nextHigh2(tests2(i))
|
|
Next i
|
|
Print Chr(10); Timer - t1; "sec."
|