Вычисление числа сохраняемости целого числа

#python

#python

Вопрос:

Я пытаюсь создать код, который выполняет следующее:

Умножение цифр целого числа и продолжение процесса дает удивительный результат: последовательность продуктов всегда достигает однозначного числа.

Например:

 715 -> 35 -> 15 -> 5

88 -> 64 -> 24 -> 8

27 -> 14 -> 4 
 

Количество продуктов, необходимых для достижения однозначного
числа, называется числом сохраняемости этого целого числа. Таким образом, 715
и 88 имеют число сохраняемости 3, в то время как 27 имеет постоянство 2.
Создать программу для поиска единственного двузначного числа с сохраняемостью
больше 3?

Я смог придумать приблизительную идею, и код приведен ниже, но, похоже, он не работает:

 num2=0
num3=0
num4=0

num=input("what is your number?")

while num in range(10,100):
    print 'step1'

    num1=num%10*num/10

    if num1-10>10:
        print 'step2'
        num2=num1%10*num1/10
    elif num2-num1>10:
        print 'step3'
        num3=num2%10*num2/10
    elif num3-num2>10:
        print 'step4'
        num4=num3%10*num3/10
    elif num4-num3>10:
        print 'step5'
        print num4
    else:
        break
 

Программа на Python, и я просто не могу этого понять. Если бы кто-нибудь мог мне помочь, я был бы очень признателен!

Комментарии:

1. @Adam Kayne: Учитывая, как сформулирована проблема, я предполагаю, что это домашнее задание, поэтому я добавил homework тег. Если это не так, пожалуйста, не стесняйтесь редактировать и удалять тег.

2. Ну, это было для клуба робототехники, но да, спасибо, я полагаю, это домашнее задание 🙂

3. Будь я менее высокомерным и педантичным, я мог бы устоять перед желанием указать, что описанный результат вряд ли «удивителен». 😉

Ответ №1:

Вы должны использовать цикл while или for для умножения цифр вместо жесткого кодирования того, что делать с первой, второй и так далее цифрами.

В псевдокоде…

 productSoFar = 1
digitsLeftToMultipy = #the number
while there are digits left to multiply:
    get the next digit and
    update produtsSoFar and digitsLeftToMultiply
 

Кроме того, используйте

 10 <= n < 100
 

вместо

 n in range(10, 100)
 

Таким образом, вы выполняете только пару сравнений вместо последовательного поиска, который занимает время, пропорциональное длине диапазона.

Ответ №2:

Функции — друзья.

Рассмотрим функцию, getEnds(x) , которая при передаче целого числа x извлекает первую цифру и последнюю цифру (как целые числа) и возвращает результат в виде кортежа в форме (first_digit, last_digit) . Если x это однозначное число, кортеж будет содержать один элемент и иметь форму (x) , в противном случае это будет два. (Простой способ сделать это — превратить число в строку, извлечь первую / последнюю цифру в виде строки, а затем преобразовать указанные строки обратно в числа… однако есть много способов: просто убедитесь, что соблюдаете контракт функции, как указано выше и, надеюсь, в документации по функции.)

Тогда, где n текущее число, для которого мы находим постоянство:

 ends = getEnds(n)
while ends contains two elements
   n = first element of ends times second element of ends
   ends = getEnds(n)
# while terminates when ends contained only one element
# now it's only a matter of "counting" the persistence
 

Для дополнительных точек убедитесь, что это также находится в функции — [an] с соответствующим именем / документировано — и рассмотрите возможность использования рекурсивной функции вместо цикла while.

Счастливого кодирования.

Ответ №3:

Если вы пытаетесь получить цифры числа, сначала преобразуйте его в строку и ссылайтесь на них с помощью обозначения массива.

Комментарии:

1. OP уже может решить свою проблему с помощью имеющихся у него инструментов (циклов и арифметических операций) На данный момент нет необходимости усложнять работу со строками и массивами.

2. Если он пытается сделать что-то питоновское, манипулирование строками намного проще, чем выполнение множества арифметических операций для извлечения цифр.