#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. Если он пытается сделать что-то питоновское, манипулирование строками намного проще, чем выполнение множества арифметических операций для извлечения цифр.