There are 9^9 9-digit numbers; 9^9 = 387420489. There are only 9! numbers with 1-9 appearing only once; 9! = 362880 (1000 times smaller set). So, the trick is to find those 9! first (using permutations or otherwise) and then check for polydivisiblity. 381654729 is the only number.
#checks if a number is polydivisible
#polydivCheck(381654729)
def polydivCheck(n, digts):
for i in range(digts, 0, -1):
if (n % i != 0):
return False
n = int(n / 10)
return True
#finds permutation for array 'input' and puts the numbers in list 'nums'
def permute(digits, input, output, flags, depth, nums):
if depth == len(input):
num = 0
factor = 1
for i in range(digits, 0, -1):
num = num + output[i - 1] * factor
factor *= 10
nums.append(num)
for i in range(len(input)):
if flags[i] == True:
continue
flags[i] = True
output[depth] = input[i]
permute(digits, input, output, flags, depth + 1, nums)
flags[i] = False
#wrapper function to call the recursive 'permute' function
def permute_wrapper(digits):
input = [i for i in range(1, digits+1)]
output = [0 for x in range(len(input))]
flags = [False for x in range(len(input))]
depth = 0
nums = []
permute(digits, input, output, flags, depth, nums);
return nums
#calls 'permute_wrapper' and for each number checks for polydivisibility
def getPolydivNums(digits):
nums = permute_wrapper(digits)
numbers=[]
for num in nums:
if polydivCheck(num, digits):
numbers.append(num)
return numbers
#start(9)
def start(digits):
nums = getPolydivNums(digits)
for n in nums:
print(n)
[Hat tip to JF]

0 comments:
Post a Comment