# 完全数 原

## VBA代码，超过100000就运行比较慢

### 主程序

``````Public iOut
Public C
Sub Main_Perfect_Number()
Dim n
Dim i
Dim t

n = 10000

iOut = 10
Perfect_Number_1 n           'Way 1

iOut = 10                    'Way 2
For i = 1 To n
t = Timer
Set C = New Collection     'Initial Factor
Perfect_Number_2 1, i, i
Sheets("Way2").Cells(10, 1) = (Timer - t)
Next i

iOut = 10                   'Way 3
Perfect_Number_3 n

End Sub

'Factor OutPut
Public Sub Facotr_OutPut(Num, S, Sht)
Dim i
iOut = iOut + 1
With Sheets(Sht)
.Cells(iOut, 1) = Num         'Object->Perfect Number
For i = 1 To S.Count
.Cells(iOut, i + 1) = S.Item(i)   'Read Collection
Next i
End With
End Sub``````

### 循环方法

#### Way1

``````'Perfect Number, Way 1
'Loop All the Factor

Sub Perfect_Number_1(ByVal Num)
Dim t
Dim iNum
Dim iFactor
Dim Tmp
Dim Count As Collection
t = Timer
For iNum = 2 To Num
Set Count = New Collection     'Initial Factor
Tmp = iNum                     'Initial Number
For iFactor = 1 To iNum - 1           'Loop process Single Number
If iNum Mod iFactor = 0 Then      'Identify whether Factor
Tmp = Tmp - iFactor           'Decrease Number
End If
If Tmp < 0 Then Exit For
Next iFactor
'check the result-----------------
If Tmp = 0 Then
Facotr_OutPut iNum, Count, "Way1"
End If
'----------------------------------
Next iNum
Sheets("Way1").Cells(10, 1) = (Timer - t)
End Sub``````

#### Way3

``````'Perfect Number, Way 1
'Loop All the Factor
'Num alway no big than Num/2

Sub Perfect_Number_3(ByVal Num)
Dim t
Dim iNum
Dim iFactor
Dim Tmp
Dim Count As Collection
t = Timer
For iNum = 2 To Int(Num / 2)
Set Count = New Collection     'Initial Factor
Tmp = iNum                     'Initial Number
For iFactor = 1 To iNum - 1           'Loop process Single Number
If iNum Mod iFactor = 0 Then      'Identify whether Factor
Tmp = Tmp - iFactor           'Decrease Number
End If
If Tmp < 0 Then Exit For
Next iFactor
'check the result-----------------
If Tmp = 0 Then
Facotr_OutPut iNum, Count, "Way3"
End If
'----------------------------------
Next iNum
Sheets("Way3").Cells(10, 1) = (Timer - t)
End Sub
``````

### 递归方法

``````'Perfect Number, Way 1
'Recursion
'>10000 will overflow

Sub Perfect_Number_2(iFactor, iNum, Num)
If iNum < 0 Then Exit Sub
If iFactor = Num Then       'Exit
If iNum = 0 Then Facotr_OutPut Num, C, "Way2"
Exit Sub
End If
If Num Mod iFactor = 0 Then
Perfect_Number_2 iFactor + 1, iNum - iFactor, Num
Else
Perfect_Number_2 iFactor + 1, iNum, Num
End If

End Sub``````

## Python,运行速度更快

``````# -*- coding: utf-8 -*-
"""
Created on Tue Oct 31 16:07:05 2017

@author: ZHENGTE
"""

'''Perfect Number, which summary of factor=Number'''
import time

def PerfectNumber(num):
l=[]
tmp=num
l.append(num)
for j in range(1,num):      #Loop factor
if num%j==0:            #Check factor
l.append(j)          #Add into LIST
tmp=tmp-j

if tmp==0:                 #Perfect Number
print l                #Print LIST
print '\n'

if __name__=='__main__':
start=time.clock()
for i in range(1,10000):     #Loop Number Range
PerfectNumber(i)         #Use Define function
print("spend",time.clock()-start)``````

本文转自网络文章，转载此文章仅为分享知识，如有侵权，请联系博主进行删除。