Нахождение «мультипликативной устойчивости» числа [closed]

Я пытался найти мультипликативную стойкость числа (т. Е. Сколько итераций создания нового числа путем умножения цифр данного числа закончились бы однозначным числом?). Я придумал следующий код.

Первоначально я имел в виду дать определенное число для мультипликативной устойчивости и получить на выходе число, имеющее указанную мультипликативную стойкость.

В качестве прототипа я написал следующее

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 ответ
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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *