Я пытался найти мультипликативную стойкость числа (т. Е. Сколько итераций создания нового числа путем умножения цифр данного числа закончились бы однозначным числом?). Я придумал следующий код.
Первоначально я имел в виду дать определенное число для мультипликативной устойчивости и получить на выходе число, имеющее указанную мультипликативную стойкость.
В качестве прототипа я написал следующее
a=10
for i in range(0,30):
c=a
count=0
while c>9:
b=1
for digits in str(a):
b=b*int(digits)
c=b
count=count+1
if count==2:
print(a)
a=a+1
И он работал нормально …. Он выплюнул все числа от 10 до 24, как и ожидалось (из 25 вы не получите однозначные числа за один шаг)
Но когда в строке 11 я поставил count == 3, код не будет выполнен .. Я ожидал, что он довольно быстро найдет 25 … Но этого не произошло, он сказал, что программа все еще работает, и это был конец. Что здесь не так?
Мне 15 лет, я совершенно новичок в Python (около 6 месяцев) и буду признателен за любой совет или критику.
1 ответ
Основная ошибка, которую вы сделали, — это использовать
for digits in str(a):
Это означает, что вы будете постоянно повторно использовать «начальное» значение «a», не обновляя его до результата умножения первой цифры. Он хорошо работает с числами с мультипликативным постоянством 1, но не более. Для a = 25 c всегда будет больше 9, а цикл while будет повторяться бесконечно.
Это можно обнаружить раньше, если вы используете имена переменных, которые более описывают то, что должно содержать значение, например, в следующем:
start_number=10
for i in range(0,30):
current = start_number
current_round = 0
while current > 9:
result=1
for digits in str(current):
result=result*int(digits)
current=result
current_round = current_round + 1
if current_round == 2:
print(start_number)
start_number=start_number+1
Здесь вы можете видеть, что в цикле for я беру цифры «текущего» числа, а не начального.
После этого ваш код также будет печатать число от 30 до 33 с «current_round == 2» (чего раньше не было).
В код еще нужно внести небольшие улучшения, но это должно ответить на ваш главный вопрос.
Пожалуйста, не отвечайте на вопросы не по теме.
— BCdotWEB