![]() |
#2
风吹过b2016-04-23 20:30
![]() Option Explicit Private Sub Command1_Click() Dim A As Long A = Int(Val(Text1.Text)) '转数值,然后取整,不要小数 Dim s As String Call verify(A, s) '不要返回值的调用,和 调用 sub 一样 Text2.Text = s End Sub Public Function verify(A As Long, ByRef s As String) As Boolean 'S显式申明按地址传递,也就是修改S值,会导致调用者内容修改 Dim i As Long, o As Long Dim j As Long 'j为因子数计数 Dim m() As Long '保存各个因子 Dim sumA As Long '各因子和 verify = False If A > 0 Then '负数不算,0不算 ReDim m(A / 2) '最大因子个数是 A/2 j = 1 '1永远是真因子,所以最少有一个因子 m(1) = 1 '第一个因子 sumA = 1 '各因子和 For i = 2 To A / 2 If A / i = Int(A / i) Then '如果能整除 j = j + 1 '因子个数计数 m(j) = i '保存因子 sumA = sumA + i '同时因子求和 End If Next i For i = 1 To j '开始测试 '若存在一个因子d`,将不是d`的所有因子相加求和,再减掉d`,若等于这个数本身 If sumA - m(i) - m(i) = A Then '如果和减掉因子本身,再减去因子 For o = 1 To j If o <> i Then '因子本身不能组合进去 s = s & " + " & m(o) '拼起来 End If Next o s = Mid(s, 4) '去掉最前面的 + 号 s = A & " = " & s & " - " & m(i) Exit For End If Next i If Len(s) > 0 Then verify = True Else s = A & "不是佩服数。" End If Else s = "请输入正整数。" End If End Function [此贴子已经被作者于2016-4-24 22:20编辑过] |
在一个整数的所有真因子(除了本身之外的所有因子)中,若存在一个因子d`,将不是d`的所有因子相加求和,再减掉d`,若等于这个数本身,则称该数为佩服数。
例如:12的所有真因子是1、2、3、4、6;12=1+3+4+6-2,因此12是一个佩服数。
下面是书上的编程,求大神完善补充,万分感谢!!!
Option Explicit
Option Base 1
Private Sub Command1_Click()
Dim I As Integer, S As Integer, F() As Integer
Dim A As Integer, B As Integer
A = Text1
B = Text2
For I = A To B
Call Yz(I, F)
If verify(I, F, S) Then
list1.AddItem I & " = " & S
End If
Next I
End Sub
Private Sub Yz(N As Integer, F() As Integer)
Dim I As Integer, K As Integer
For I = 1 To N - 1
if then
ReDim Preserve F(K)
End If
Next I
End Sub
Private Function verify(N As Integer, F() As Integer, St As String) As Boolean
Dim I As Integer, K As Integer, Sum As Integer, J As Integer
For I = 1 To UBound(F)
Sum = 0
For J = 1 To UBound(F)
If J <> 1 Then
St = St & F(J) & "+"
End If
Next J
If N = Sum - F(I) Then
St = Left(St, Len(St) - 1) & "-" & F(I)
Exit Function
End If
Next I
End Function