Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.58/64: Рейтинг темы: голосов - 64, средняя оценка - 4.58
1 / 1 / 0
Регистрация: 08.04.2020
Сообщений: 18

Решение задачи "Цифровой корень"

16.09.2021, 16:23. Показов 15575. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, коллеги!
Помогите, пожалуйста, найти ошибку в коде.

Вот такое условие задачи:
На вход программе подается натуральное число nn. Напишите программу, которая находит цифровой корень данного числа. Цифровой корень числа nn получается следующим образом: если сложить все цифры этого числа, затем все цифры найденной суммы и повторить этот процесс, то в результате будет получено однозначное число (цифра), которое и называется цифровым корнем данного числа. (использовать сложенный цикл while)

Python
1
2
3
4
5
6
7
8
9
10
11
12
n = int(input())
digit = 0
if n <= 9:
    print(n)
else:
    while True:
        for i in range(len(str(n))):
            digit += n % 10
            n = n // 10
        if digit <= 9:
            break
    print(digit)
Не могу понять, почему мой код не работает. Например для числа 192 ответ - цифра 3. У меня не получается.
Заранее большое спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.09.2021, 16:23
Ответы с готовыми решениями:

Цифровой корень
Помогите найти промах в коде Задача : Цифровой корень натурального числа получается следующим образом. Складываются все цифры...

Рекурсия цифровой корень
Чтобы найти &quot;цифровой корень&quot; числа, нужно сложить все цифры числа. Потом найти сумму цифр полученного числа. И повторять пока число не...

Найти цифровой корень
Цифровой корень Цифровой корень натурального числа получается следующим образом. Складываются все цифры данного числа. Процесс...

12
-30 / 1 / 0
Регистрация: 22.02.2021
Сообщений: 47
16.09.2021, 16:25
ааа
0
enx
 Аватар для enx
1190 / 766 / 277
Регистрация: 05.09.2021
Сообщений: 1,772
16.09.2021, 16:40
Вы если не против, я ваш код чуть поменял:

Python
1
2
3
4
n = int(input())
while n > 9:
    n = sum(int(i) for i in str(n))
print(n)
1
1 / 1 / 0
Регистрация: 08.04.2020
Сообщений: 18
16.09.2021, 16:48  [ТС]
А почему не работает мой вариант? Не могу найти ошибку.
1
enx
 Аватар для enx
1190 / 766 / 277
Регистрация: 05.09.2021
Сообщений: 1,772
16.09.2021, 16:48
Вы задавайте вопросы, если хотите разобраться, я дам комментарии где у вас именно ошибка, и почему в целом код плохой. Если вам конечно это нужно.
1
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
16.09.2021, 16:56
zantal,
А почему не работает мой вариант? Не могу найти ошибку.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
n = int(input())
#digit = 0
if n <= 9:
    print(n)
else:
    while True:
        
        #####
        digit = 0
        #####
        
        for i in range(len(str(n))):
            digit += n % 10
            n = n // 10
        if digit <= 9:
            break
            
        #####
        n = digit
        #####
        
    print(digit)
2
enx
 Аватар для enx
1190 / 766 / 277
Регистрация: 05.09.2021
Сообщений: 1,772
16.09.2021, 16:57
zantal, вот это очень верный подход, мое уважение. Давайте тогда пойдем по порядку.

1. Начнем с того, что у нас есть лишнее ветвление, 3 - 5 строки, убираем его. Почему, дело в том, что проще всего понять цикл while как некое условие, аналогичное if else. Например, если мы знаем, что цикл должен остановиться как только мы получили число меньшее 10, давайте так и сделаем. Шаг 1 преобразования вашего кода:

Python
1
2
3
4
5
6
7
8
9
n = int(input())
digit = 0
while n > 9:
    for i in range(len(str(n))):
        digit += n % 10
        n = n // 10
    if digit <= 9:
        break
print(digit)
2. Шаг 2, поскольку мы изначально сделали верное условие в while, нам не нужен break, убираем и его:

Python
1
2
3
4
5
6
7
n = int(input())
digit = 0
while n > 9:
    for i in range(len(str(n))):
        digit += n % 10
        n = n // 10
print(digit)
3. И теперь смотрим, что у нас происходит, когда код стал более читаемым, нас интересует 5 строка, где мы плюсуем остаток от деления на 10...но для каждого нового числа полученного в результате суммы, на же нужно брать новые остатки. Понимаем, что это ошибка, да и в целом данная переменная не нужна, все можно делать с исходным числом, думаем, как внутри цикла нам получить сумму. Прибегаем к помощи генераторов, преобразуем инт к строке, считаем сумму, говорим - что эта сумма новая n.
2
1 / 1 / 0
Регистрация: 08.04.2020
Сообщений: 18
16.09.2021, 17:05  [ТС]
Спасибо Вам всем большое!
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38177 / 21112 / 4307
Регистрация: 12.02.2012
Сообщений: 34,716
Записей в блоге: 14
16.09.2021, 17:10
Python
1
2
3
4
5
def num_root(n):
    if n<10:
        return n
    else:
        return num_root(sum(map(int,list(str(n)))))
1
1 / 1 / 0
Регистрация: 08.04.2020
Сообщений: 18
16.09.2021, 17:44  [ТС]
А можете прокомментировать ещё раз более подробно код из п.2 Вашего сообщения. Почему он неверный? Например, на вход подаётся число 192. В теле цикла for на первой итерации мы к digit добавляем цифру "2". При этом n делаем "19". Но второй итерации мы к digit (где уже лежит "2") добавляем "9". digit становится равным "11", а n = 1. На последней итерации digit = 11+1 = 12, а n = 0, но почему то при while не идёт вторая итерация. Видимо потому что n = 0 и нет входа в цикл for?
0
enx
 Аватар для enx
1190 / 766 / 277
Регистрация: 05.09.2021
Сообщений: 1,772
16.09.2021, 17:48
Верно, когда начинается 2 итерация, чему равен n? Вам господин Gdez показал это максимально подробно, где он при каждом новом цикле while обнуляет digit, считает в нее сумму, после чего присваивает значение digit для n.
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
16.09.2021, 17:57
enx,
Кликните здесь для просмотра всего текста
1
1 / 1 / 0
Регистрация: 08.04.2020
Сообщений: 18
17.09.2021, 11:51  [ТС]
Всё понял, спасибо большое ещё раз)))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.09.2021, 11:51
Помогаю со студенческими работами здесь

Простой цифровой корень (ПЦК) натурального числа
Доброго времени суток всем пользователям! Появилась проблема, не могу понять в чем проблема в задаче. Условие: Определим простой...

Цифровой корень
Помогите пожалуйста решить задачку. Рассмотрим произвольное натуральное число N и найдем сумму его цифр, потом сумму цифр полученного...

Цифровой корень
Доброго времени суток! Подскажите код цифрового корня натурального числа? Написал код для Delphi, нужен аналог на JS. Заранее спасибо ...

Цифровой корень
Рассмотрим натуральное число и определим сумму его цифр, тогда сумму цифр полученого числа и так далее, пока не получим одноцифровое число....

Цифровой корень
написать рекурсивную функцию для нахождения цифрового корня натурального числа


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru