水仙花数,又叫超完全数字不变数
用来描述一个N位非负整数,其各位数字的N次方和等于该数本身
https://zh.wikipedia.org/wiki/%E6%B0%B4%E4%BB%99%E8%8A%B1%E6%95%B0
以下数字为水仙花数
具体VBA代码如下:
'Narcissistic number aslo called as PPDI(pluperfect digital invariant)
'abc=a^k+b^k+e^k
Sub PPDI()
Dim num& 'Original Number
Dim lenNum%
Dim arr%(), k
Dim remainVal&, Expo%
Dim i%
Dim sumVal&
Dim Count
Dim wsLine&
Dim Str$
Count = 0
num = 100 'Initial Number
Do While num >= 100 And num <= 999
lenNum = Len(CStr(num))
ReDim arr(1 To lenNum) 'Store Signal
remainVal = num 'Remain Value for calculate
For i = 1 To lenNum 'Split Number as Signal
Expo = lenNum - i
If Expo = 0 Then
arr(i) = remainVal Mod 10 'Last digit
Else
arr(i) = Int(remainVal / 10 ^ Expo)
If remainVal > 10 ^ Expo Then remainVal = remainVal - 10 ^ Expo * arr(i)
' remainVal = Max(remainVal, remainVal - 10 ^ Expo) 'No Max function in VBA
End If
Next i
sumVal = 0
Str = ""
For i = 1 To UBound(arr) 'Sum by Single Expo
sumVal = sumVal + arr(i) ^ lenNum
Str = Str & "+" & arr(i) & "^" & lenNum
Next i
If sumVal = num Then 'Find PPDI
Count = Count + 1
With Sheet3 '<--Export
wsLine = 3 + Count
.Cells(wsLine, 6) = num
.Cells(wsLine, 7) = Str
End With
End If
num = num + 1 'Next Number
Loop
Debug.Print Time
End Sub
完全数字不变数
若将条件放宽,一个N位数,其各个数之M次方和等于该数,M和N不一定相等
以下数字为完全数字不变数
具体VBA代码如下:
'PDI(Perfect Digital Invariant)
'abc=a^k+b^k+e^k
Sub PDI()
Dim num& 'Original Number
Dim lenNum%
Dim arr%(), k
Dim strVal, Expo%
Dim i%
Dim sumVal&
Dim Count
Dim wsLine&
Dim Str$
Count = 0
num = 10 'Initial Number
Do While num >= 10 And num <= 9999
lenNum = Len(CStr(num))
ReDim arr(1 To lenNum) 'Store Signal
strVal = CStr(num) 'Convert to String for Split Using
For i = 1 To lenNum 'Split Number as Signal
arr(i) = Mid(strVal, i, 1)
Next i
For Expo = 0 To 9 'Loop Expo from 0~9
sumVal = 0
Str = ""
For i = 1 To UBound(arr) 'Sum by Single Expo
sumVal = sumVal + arr(i) ^ Expo
Str = Str & "+" & arr(i) & "^" & Expo
Next i
If sumVal = num Then 'Find PPDI
Count = Count + 1
With Sheet3 '<--Export
wsLine = 13 + Count
.Cells(wsLine, 6) = num
.Cells(wsLine, 7) = Str
End With
End If
Next Expo
num = num + 1 'Next Number
Loop
Debug.Print Time
End Sub