这个问题很简单啊,或者是我理解错了?Option ExplicitPrivate Sub Form_Load() Form1.AutoRedraw = True Dim intI As Integer, strI As String Dim intW4 As Integer, intW3 As Integer, intW2 As Integer Dim intW1 As Integer, intAll As Single For intI = 10 To 9999 strI = CStr(intI) If Len(strI) = 2 Then intW2 = Left(strI, 1) intW1 = Right(strI, 1) intAll = intW2 ^ 2 + intW1 ^ 2 If intAll = intI Then Print intI End If End If If Len(strI) = 3 Then intW3 = Mid(strI, 1, 1) intW2 = Mid(strI, 2, 1) intW1 = Mid(strI, 3, 1) intAll = intW3 ^ 3 + intW2 ^ 3 + intW1 ^ 3 If intAll = intI Then Print intI End If End If If Len(strI) = 4 Then intW4 = Mid(strI, 1, 1) intW3 = Mid(strI, 2, 1) intW2 = Mid(strI, 3, 1) intW1 = Mid(strI, 4, 1) intAll = intW4 ^ 4 + intW3 ^ 4 + intW2 ^ 4 + intW1 ^ 4 If intAll = intI Then Print intI End If End If Next intI End Sub结果: 153 370 371 407 1634 8208 9474
Private Sub Command1_Click() Dim i, j, k, l As Integer For i = 1 To 9 For j = 1 To 9 If i * 10 + j = i ^ 2 + j ^ 2 Then Print i & j Next j Next i For i = 1 To 9 For j = 1 To 9 For k = 1 To 9 If i * 100 + j * 10 + k = i ^ 3 + j ^ 3 + k ^ 3 Then Print i & j & k Next k Next j Next i For i = 1 To 9 For j = 1 To 9 For k = 1 To 9 For l = 1 To 9 If i * 1000 + j * 100 + k * 10 + l = i ^ 4 + j ^ 4 + k ^ 4 + l ^ 4 Then Print i & j & k & l Next l Next k Next j Next i End Sub
Private Sub Command1_Click() For i = 10 To 9999 Select Case Len(i) Case 2 a = Mid(i, 1, 1): b = Mid(i, 2, 1) If a * a * a + b * b * b = i Then Print i Case 3 a = Mid(i, 1, 1): b = Mid(i, 2, 1): c = Mid(i, 3, 1) If a * a * a + b * b * b + c * c * c = i Then Print i Case 4 a = Mid(i, 1, 1): b = Mid(i, 2, 1): c = Mid(i, 3, 1): d = Mid(i, 4, 1) If a * a * a + b * b * b + c * c * c + d * d * d = i Then Print i End Select Next i End Sub
'算法如下: '一个n位的数等于它的各位数的n次方之和 '如153等于1的3次方加上5的3次方加上3的3次方等等 '要求求所有2,3,4位的水仙花数 '************************************************** Dim IntStr As Long '数字长度 Dim IngNumber As Long '最高数字值 Dim II As Long, JJ As Long Dim CurValue As Long '当前位数结果 Dim CurStr As Long '当前位数长度IntStr = 5 '初始化位数 '取得最大值 IngNumber = 10 ^ IntStr - 1 For II = 10 To IngNumber CurStr = Len(CStr(II)) '取得当前数字的位数 For JJ = 0 To (CurStr - 1) CurValue = CurValue + CLng(Mid(II, JJ + 1, 1)) ^ 3 Next If II = CurValue Then Print II End If CurValue = 0 '清空当前数据 Next End Sub此算法算到5位,速度非常快,6位就很慢了 实际上 153 370 371 407 也就这么四个,四位数以上应该根本没有的;我已经尽量的没有使用判断了,就是循环也只是最小范围的循环,如果可以,可以尽量的优化一下
我也来凑凑热闹Private Function Func(ByVal Value As Long) Dim lngValue As Long Dim intDigits As Integer Dim N As Integer Dim intRemain As Integer Dim lngSum As Long
intDigits = Fix(Log(Value) / Log(10)) + 1 lngValue = Value
N = intDigits Do While N > 0 intRemain = lngValue Mod 10 lngSum = lngSum + intRemain ^ intDigits lngValue = Fix(lngValue / 10) N = N - 1 Loop
Func = Value = lngSum
End FunctionPrivate Sub Command1_Click() For i = 10 To 9999999 If Func(i) Then Debug.Print i Next i End Sub'===================================== (花了好几分钟) 153 370 371 407 1634 8208 9474 54748 92727 93084 548834 1741725 4210818 9800817 9926315
'算法如下: '一个n位的数等于它的各位数的n次方之和 '如153等于1的3次方加上5的3次方加上3的3次方等等 '要求求所有2,3,4位的水仙花数 '************************************************** Dim IntStr As Long '数字长度 Dim IngNumber As Long '最高数字值 Dim II As Long, JJ As Long Dim CurValue As Long '当前位数结果 Dim CurStr As Long '当前位数长度IntStr = 5 '初始化位数 '取得最大值 IngNumber = 10 ^ IntStr - 1 For II = 10 To IngNumber CurStr = Len(CStr(II)) '取得当前数字的位数 For JJ = 0 To (CurStr - 1) CurValue = CurValue + CLng(Mid(II, JJ + 1, 1)) ^ CurStr Next If II = CurValue Then Debug.Print II End If CurValue = 0 '清空当前数据 Next'__________________________________结果如下 153 370 371 407 1634 8208 9474 54748 92727 93084 上次给的答案错了一点点,呵呵,5位的用了3秒多,不算慢了
Form1.AutoRedraw = True
Dim intI As Integer, strI As String
Dim intW4 As Integer, intW3 As Integer, intW2 As Integer
Dim intW1 As Integer, intAll As Single
For intI = 10 To 9999
strI = CStr(intI)
If Len(strI) = 2 Then
intW2 = Left(strI, 1)
intW1 = Right(strI, 1)
intAll = intW2 ^ 2 + intW1 ^ 2
If intAll = intI Then
Print intI
End If
End If
If Len(strI) = 3 Then
intW3 = Mid(strI, 1, 1)
intW2 = Mid(strI, 2, 1)
intW1 = Mid(strI, 3, 1)
intAll = intW3 ^ 3 + intW2 ^ 3 + intW1 ^ 3
If intAll = intI Then
Print intI
End If
End If
If Len(strI) = 4 Then
intW4 = Mid(strI, 1, 1)
intW3 = Mid(strI, 2, 1)
intW2 = Mid(strI, 3, 1)
intW1 = Mid(strI, 4, 1)
intAll = intW4 ^ 4 + intW3 ^ 4 + intW2 ^ 4 + intW1 ^ 4
If intAll = intI Then
Print intI
End If
End If
Next intI
End Sub结果:
153
370
371
407
1634
8208
9474
Dim i, j, k, l As Integer
For i = 1 To 9
For j = 1 To 9
If i * 10 + j = i ^ 2 + j ^ 2 Then Print i & j
Next j
Next i
For i = 1 To 9
For j = 1 To 9
For k = 1 To 9
If i * 100 + j * 10 + k = i ^ 3 + j ^ 3 + k ^ 3 Then Print i & j & k
Next k
Next j
Next i
For i = 1 To 9
For j = 1 To 9
For k = 1 To 9
For l = 1 To 9
If i * 1000 + j * 100 + k * 10 + l = i ^ 4 + j ^ 4 + k ^ 4 + l ^ 4 Then Print i & j & k & l
Next l
Next k
Next j
Next i
End Sub
For i = 10 To 9999
Select Case Len(i)
Case 2
a = Mid(i, 1, 1): b = Mid(i, 2, 1)
If a * a * a + b * b * b = i Then Print i
Case 3
a = Mid(i, 1, 1): b = Mid(i, 2, 1): c = Mid(i, 3, 1)
If a * a * a + b * b * b + c * c * c = i Then Print i
Case 4
a = Mid(i, 1, 1): b = Mid(i, 2, 1): c = Mid(i, 3, 1): d = Mid(i, 4, 1)
If a * a * a + b * b * b + c * c * c + d * d * d = i Then Print i
End Select
Next i
End Sub
'一个n位的数等于它的各位数的n次方之和
'如153等于1的3次方加上5的3次方加上3的3次方等等
'要求求所有2,3,4位的水仙花数
'**************************************************
Dim IntStr As Long '数字长度
Dim IngNumber As Long '最高数字值
Dim II As Long, JJ As Long
Dim CurValue As Long '当前位数结果
Dim CurStr As Long '当前位数长度IntStr = 5 '初始化位数
'取得最大值
IngNumber = 10 ^ IntStr - 1
For II = 10 To IngNumber
CurStr = Len(CStr(II)) '取得当前数字的位数
For JJ = 0 To (CurStr - 1)
CurValue = CurValue + CLng(Mid(II, JJ + 1, 1)) ^ 3
Next
If II = CurValue Then
Print II
End If
CurValue = 0 '清空当前数据
Next
End Sub此算法算到5位,速度非常快,6位就很慢了
实际上
153
370
371
407
也就这么四个,四位数以上应该根本没有的;我已经尽量的没有使用判断了,就是循环也只是最小范围的循环,如果可以,可以尽量的优化一下
Dim intDigits As Integer
Dim N As Integer
Dim intRemain As Integer
Dim lngSum As Long
intDigits = Fix(Log(Value) / Log(10)) + 1
lngValue = Value
N = intDigits
Do While N > 0
intRemain = lngValue Mod 10
lngSum = lngSum + intRemain ^ intDigits
lngValue = Fix(lngValue / 10)
N = N - 1
Loop
Func = Value = lngSum
End FunctionPrivate Sub Command1_Click()
For i = 10 To 9999999
If Func(i) Then Debug.Print i
Next i
End Sub'=====================================
(花了好几分钟)
153
370
371
407
1634
8208
9474
54748
92727
93084
548834
1741725
4210818
9800817
9926315
'一个n位的数等于它的各位数的n次方之和
'如153等于1的3次方加上5的3次方加上3的3次方等等
'要求求所有2,3,4位的水仙花数
'**************************************************
Dim IntStr As Long '数字长度
Dim IngNumber As Long '最高数字值
Dim II As Long, JJ As Long
Dim CurValue As Long '当前位数结果
Dim CurStr As Long '当前位数长度IntStr = 5 '初始化位数
'取得最大值
IngNumber = 10 ^ IntStr - 1
For II = 10 To IngNumber
CurStr = Len(CStr(II)) '取得当前数字的位数
For JJ = 0 To (CurStr - 1)
CurValue = CurValue + CLng(Mid(II, JJ + 1, 1)) ^ CurStr
Next
If II = CurValue Then
Debug.Print II
End If
CurValue = 0 '清空当前数据
Next'__________________________________结果如下
153
370
371
407
1634
8208
9474
54748
92727
93084 上次给的答案错了一点点,呵呵,5位的用了3秒多,不算慢了
54748 = 5^5 + 4^5 + 7^5 + 4^5 + 8^5
9926315 = 9^7 + 9^7 + 2^7 + 6^7 + 3^7 + 1^7 + 5^7