http://bbs.youkuaiyun.com/topics/360188055#r_73147548
# -*- coding:utf-8 -*-
#! /usr/bin/env python
'''
Created on 2014年7月24日
@author: dWX232085
'''
#存放10的0~N次方
powerOfTen = [1]
#存放0~9的数i的N次方乘以出现次数j的结果(j*i^N)
preTable = []
#记录离PreTable中对应数最近的10的k次方
preTable3 = []
#记录0到9中每个数出现的次数
selected = []
#记录armstrong数的长度(位数)
length = 0
#记录已经找到的armstrong数的个数
count = 0
#记录进制
numberSystem = 10
def armstrongNum(n):
global length,preTable,preTable3,powerOfTen
length = n
for i in range(1,n+1):
powerOfTen.append(powerOfTen[i-1]*10)
preTable3 = [[None]*(n+1)]*numberSystem
for i in range(numberSystem):
preTable.append([])
for j in range(n+1):
preTable[i].append((i**n)*j)
for k in range(n, -1, -1):
if powerOfTen[k]<preTable[i][j]:
preTable3[i][j]=k
# print preTable3[i][j]
break
# print preTable[3][39]
def show():
search(numberSystem-1, 0, length)
# currentIndex 当前正在选择的数字
# sum当前已选数字N次方之和
# remainCount还可以选择多少个数字
def search(currentIndex, sum, remainCount):
global count,selected
selected = [None]*10
if sum >= powerOfTen[length]:return #第1个结束条件
if remainCount==0:
if sum > powerOfTen[length-1] and check(sum):
count+=1
print count+'.',sum
return
if not preCheck(currentIndex, sum, remainCount):return #结束条件3,4
if (sum+preTable[currentIndex][remainCount])<powerOfTen[length-1]:return #结束条件2
if currentIndex == 0: #选到0时的处理
selected[0]=remainCount
search(-1, sum, 0)
else:
for i in range(remainCount+1): #穷举所有可能的情况
selected[currentIndex] = i
search(currentIndex-1, sum+(preTable[currentIndex][i]), remainCount-i)
selected[currentIndex] = 0
def preCheck(currentIndex, sum, remainCount):
if sum < preTable[currentIndex][remainCount]:return True
max = sum+preTable[currentIndex][remainCount] #当前情况的最大值
max /= powerOfTen[preTable3[currentIndex][remainCount]] #取当前sum和max的前面部分进行比较
sum /= powerOfTen[preTable3[currentIndex][remainCount]]
#检验sum和max首部是否有相同的部分
while max!=sum:
max/=10
sum/=10
if max==0:return True #无相同部分
counter = getCounter(max)
for i in range(9, currentIndex, -1):
if counter[i]>selected[i]:return False #结束条件3
for i in range(currentIndex+1):remainCount -= counter[i]
return remainCount >= 0 #结束条件4
def check(sum):
counter = getCounter(sum)
for i in range(numberSystem):
if selected[i]!=counter[i]:return False
return True
def getCounter(value):
counter = [0]*numberSystem
sumChar = list(str(value))
for i in range(len(sumChar)):
counter[ord(sumChar[i])-ord('0')]+=1
return counter