I was watching this Numberphile video: https://youtu.be/Wim9WJeDTHQ on multiplicative persistence (multiplying digits of a number over and over until one digit remains). I decided to take up the challenge, first of creating a program that calculates the multiplicative persistence of a given number, then reversing the process to return the smallest number with a given level of multiplicative persistence. This is the first half:
# Calculating the multiplicative persistence of a given number
def per():
number = input("Enter an integer: ")
steps = 0
if len(number) == 1:
print(number)
print(f"Number of steps: {steps}")
else:
while len(number) > 1:
digits = [int(digit) for digit in number]
new_number = 1
for digit_multiply in digits:
new_number *= digit_multiply
print(new_number)
steps += 1
number = str(new_number)
print(f"Number of steps: {steps}")
per()
The other half of returning the smallest number with a given MP level is below, but warning: I couldn't figure out how to put a limit on the process and I noticed that my computer took a long time returning the number after a persistence of 8. I don't know what the problem but I'm afraid it may have something to do with memory; hopefully you can enlighten me:
# Calculating the multiplicative persistence of a given number
def persistence(number):
steps = 0
while len(str(number)) > 1:
digits = [int(digit) for digit in str(number)]
new_number = 1
for digit_multiply in digits:
new_number *= digit_multiply
steps += 1
number = str(new_number)
return steps
# Finding the smallest number of a given persistence level
def numb_finder(level):
number = 0
while persistence(number) < level:
number += 1
return number
desired_level = int(input("Multiplicative Persistence Level: "))
print(f"Smallest number: {numb_finder(desired_level)}")
Thanks as always!