Разделите целые числа дня месяца на цифры, суммируйте их многократно, пока не получите однозначное целое число

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

Например, если значение для дня было целым числом 29, то программа превратит это в строки и разделит их на "2" и "9". Затем программа превратила бы 2 и 9 в целые числа и сложила бы их вместе, чтобы они равнялись 11. Так как это все еще двузначное число, программа зациклилась бы, и 1 и 1 были бы сложены вместе, и окончательное значение, которое должно было бы вывести, было бы 2. Согласно приведенному ниже коду (в основном последние ~5 строк), если я введу день =29, то последний ответ, который я продолжаю получать, равен 4, что неверно. Может кто-нибудь помочь мне исправить это:

Обратите внимание, что кто-то упомянул, что я не входил в dayStringSum и случайно удалил их пост, не уверен, что это вообще значит.

 dayString = str(int(day))
# Turns value day into int
dayStringA = int(str(dayString[0]))
# If day=29 then this variable represents the 2...
dayStringB = int(str(dayString[1]))
# ...and this represents the 9
dayStringSum = (dayStringA + dayStringA)
while(dayStringSum >=10):
    dayStringA = int(str(dayStringSum[0]))
# Since daystringsum is now 11, this code changes the value of daystringA into a new value of 1, likewise for below.
    dayStringB = int(str(dayStringSum[1]))

print(dayStringSum)

5 ответов

Решение

dayStringSum целое число, так dayStringSum[n] не имеет смысла. Сначала вы захотите превратить его в строку, а затем посмотреть на отдельные символы.

Кроме того, вы не назначаете новое значение для dayStringSum внутри while loop, так что если при входе в цикл>= 10, он останется таковым, что приведет к бесконечному циклу. Вы говорите, что вы получили конечный результат 4, но я не вижу, как вы получите окончательный результат вообще.

Попробуйте что-то вроде этого:

daySum = int(day)  # Ensure that day is an int before we start.

while(daySum >= 10):
    newString = str(daySum)
    dayIntA = int(newString[0])
    dayIntB = int(newString[1])
    daySum = dayIntA + dayIntB  # Will be checked on next iteration.

print(daySum)

Я предполагаю, что причина, по которой вы получаете неправильный ответ, заключается в том, что вы добавляете dayStringA + dayStringA когда ты хотел добавить dayStringA + dayStringB это просто опечатка.

Другое, что вам нужно исправить, это то, что в цикле вы не меняете dayStringSum, До сих пор это не было проблемой, потому что dayStringSum в вашем примере меньше 10, поэтому цикл никогда не выполняется, но как только вы исправите эту опечатку, вы получите бесконечный цикл, и программа никогда не остановится.

Вот что я имею в виду: предположим, ваш день 29, Когда вы доберетесь до этой строки:

while(dayStringSum >=10):

затем dayStringSum будет 11. Итак, вы установили dayStringA до 1,

    dayStringA= int(str(dayStringSum[0]))

а также dayStringB до 1.

    dayStringB= int(str(dayStringSum[1]))

Тогда это конец цикла. Итак, Python возвращается к этой строке:

while(dayStringSum >=10):

какой dayStringSum? Почему это все еще 11! Вы никогда не меняли это. Таким образом, Python будет продолжать цикл, повторяя одну и ту же логику снова и снова.

Помимо этого, есть множество вещей, которые делают этот код более сложным, чем он должен быть. Я не собираюсь проходить через них ( Code Code было бы местом для этого), но в целом вам не нужно преобразовывать вещи в int с, если они уже int s, а также вам не нужно использовать str на то, что уже является строкой.

day = 29

while day >= 10:
    day = sum(int(digit) for digit in str(day))

(Кроме того, всякий раз, когда вы делаете основные манипуляции с отдельными цифрами целого числа, decimal.Decimal полезен, в частности, его методDecimal(29).as_tuple().digits что дает вам (2, 9)).

Проще всего взять модуль 9 числа

>>> print(29%9)
2

Пытаться sum(map(int,"265"))

который отображает их в целые числа и суммирует их...

>>> sum(map(int,"254"))
11

или же

>>> sum(map(int,str(29)))
11

о хорошо, так как его домашнее задание я не могу просто дать ответ....

но

это похоже на

sum1=0
for integer in [1,2,3]: sum1 += integer
print sum1
Другие вопросы по тегам