|
VBA实现九个数字分成二组
将1、2、3、4、5、6、7、8、9九个数字分成二组,每个数字只能用一次,一组形成一个5位数,
另一组形成一个4位数,使得前者为后者的n倍。求所有满足条件的5位数和4位数。
(注意:N的最大值等于68,68以内的某些N也是不可能的。
不可能的N值包括:1、10、11、20、21、25、30、31等共32个。)
被除数从最小的可能值12345开始,递增,要判断被除数的正确性(无重复数字且不含0),
然后用剩下的4个数来组成除数,再两者相除,如果能够整除,则输出。
- Sub test()
- Dim k&, k1&, tms#, N&
- [a:b] = ""
- tms = Timer
- Dim xstr$, x$, a$, b$, c$, d$
- xstr = "123456789"
-
- For k = 12345 To 98765
- If Chk(k) Then
- x = xstr
- For i = 1 To 5
- x = Replace(x, Mid(k, i, 1), "")
- Next
- For i = 1 To 4
- For j = 1 To 4
- For m = 1 To 4
- If i <> j And i <> m And j <> m Then
- a = Mid(x, i, 1): b = Mid(x, j, 1): c = Mid(x, m, 1)
- d = Replace(Replace(Replace(x, a, ""), b, ""), c, "")
- k1 = Val(a & b & c & d)
- If k Mod k1 = 0 Then
- N = N + 1
- Cells(N, 1) = k / k1
- Cells(N, 2) = k & "÷" & k1
- End If
- End If
- Next
- Next
- Next
- End If
- Next
- [a1].Resize(N, 2).Sort key1:=[a1]
- MsgBox Format(Timer - tms, "0.000s ") & kk
- End Sub
- Function Chk(s) As Boolean
- Dim i&
- If InStr(s, "0") Then Exit Function
- For i = 1 To Len(s) - 1
- If InStr(i + 1, s, Mid(s, i, 1)) Then Exit Function
- Next
- Chk = True
- End Function
复制代码
|
|