零基础没算法->水仙花数

水仙花数,又叫超完全数字不变数

用来描述一个N位非负整数,其各位数字的N次方和等于该数本身

https://zh.wikipedia.org/wiki/%E6%B0%B4%E4%BB%99%E8%8A%B1%E6%95%B0

以下数字为水仙花数

ae6d2d36ea75432642b9cb49c349375e03c.jpg

具体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不一定相等

以下数字为完全数字不变数

eb3c778b5a05a98f061e5c64b63e7cd038d.jpg

具体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

 

转载于:https://my.oschina.net/tedzheng/blog/3001257

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值