Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
0 / 0 / 0
Регистрация: 03.01.2024
Сообщений: 11

Числа с заданной суммой цифр

17.10.2025, 00:59. Показов 3302. Ответов 37
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Напишите программу, которая вычисляет количество чисел, состоящих из K цифр, для которых сумма цифр равна N .

Входные данные

Входная строка содержит два числа: количество цифр K и сумму цифр N , разделённых пробелами.

Выходные данные

Программа должна вывести одно число: количество чисел, состоящих из K цифр, для которых сумма цифр равна N .

Примеры
Входные данные
3 2
Выходные данные
6
Входные данные
3 30
Выходные данные
0
Мой код:
Python
1
2
3
4
5
6
7
8
k, n = map(int, input().split())
 
chh = 0
for i in range(int('1' + (k - 1) * '0'), int(k * '9') + 1):
    
    if n == sum(map(int, str(i))):
        chh += 1
print(chh)
Подскажите, как можно доработать код? В идеале задача должна решаться через рекурсию.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.10.2025, 00:59
Ответы с готовыми решениями:

Числа с заданной суммой цифр
Напишите программу, которая вычисляет количество чисел, состоящих из K цифр, для которых сумма цифр...

Определить разницу между суммой элементов с четными индексами и суммой элементов, индексы которых кратны трем
Случайным образом создать список действительных чисел. Определить разницу между суммой элементов с...

Проверить есть ли расхождение между итоговой суммой и суммой стоимости перечисленных продуктов
После случая, когда старший брат послал младшего в магазин за кефиром, а тот его не купил и не...

37
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,338
18.10.2025, 00:28
Студворк — интернет-сервис помощи студентам
Исправил у ТС ошибку, теперь программа выводит нужные результат:
Python
1
2
3
4
5
6
7
8
k, n = map(int, input().split())
 
chh = 0
for i in range(int('1' + (k - 1) * '0'), int(k * '9') + 1):
 
    if n == sum(map(int, str(i))):
        chh += 2
print(chh)
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,320
18.10.2025, 08:22
При к=7 время выполнения вылетает
И при к, n = 6, 6 неверный результат
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38228 / 21160 / 4314
Регистрация: 12.02.2012
Сообщений: 34,774
Записей в блоге: 14
18.10.2025, 08:36
isaak, Вы можете объяснить, как работает это решение?
0
18.10.2025, 08:45

Не по теме:

Цитата Сообщение от SmallEvil Посмотреть сообщение
Но точные науки и программирование это не твоё.
Обрати свои советы к себе... не твое вообще, в принципе, раздавать советы, лучше займись самообразованием...

0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38228 / 21160 / 4314
Регистрация: 12.02.2012
Сообщений: 34,774
Записей в блоге: 14
18.10.2025, 09:00
Если незначащие нули в начале числа допустимы, то вот без особых затей:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
k, n = map(int, input().split())
if n>k*9:
    print(0)
elif n==k*9:
    print(1)
else:
    q=0
    v=[0]*k
    while True:
        if sum(v)==n:
            #print(v)  # если нужны разряды
            q+=1
        i=0
        while i<k:
            if v[i]<9:
                v[i]+=1
                break
            else:
                v[i]=0
                i+=1
        if (i < k):
            continue
        break
    print(q)
2
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
18.10.2025, 09:53
Цитата Сообщение от thyrex Посмотреть сообщение
Числа ведь могут быть и отрицательные
числа могут, конечно... цифры не могут.
Но это, кстати, почти заявка, на выполнение моего опрометчивого обещания, буде автор сей задачи если появится, упаду таки ему в ножки, посыплю голову пеплом и попрошу прощения.
Code
1
2
3
4
5
6
101
110
200
-101
-110
-200
- таки это шесть разных чисел
Да и ещё в условиях нет упоминания о том, что числа десятичные и целые, такшта при достаточно буйно развитой фантазии, можно тут наворотить таких решений, что автор задачи лопнет от счастья.

Добавлено через 7 минут
Цитата Сообщение от Catstail Посмотреть сообщение
Если незначащие нули в начале числа допустимы
Думаю в отношении питона, это вряд ли имелось в виду, здесь, скорее всего, на 100% прав thyrex

Цитата Сообщение от pyton567 Посмотреть сообщение
как можно доработать код?
Python
1
2
3
4
5
6
7
8
k,n = map(int, input().split())
arr = list(range(-(1*10**k)+1,-(1*10**(k - 1))+1)) + list(range(1*10**(k-1),1*10**k))
chh = 0
for i in arr:
    if n == sum(map(int, str(abs(i)))):
        #print(i)
        chh += 1
print(chh)
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38228 / 21160 / 4314
Регистрация: 12.02.2012
Сообщений: 34,774
Записей в блоге: 14
18.10.2025, 09:58
YuS_2, а почему Ваш код даёт верный результат? Из кода это совсем не очевидно...
0
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
18.10.2025, 10:03
Цитата Сообщение от Gdez Посмотреть сообщение
Сама задача:
Ну, а пока:
Уважаемый, Поляков-Еремин, прошу прощения, падаю в ножки и посыпаю голову пеплом!


Добавлено через 58 секунд
Цитата Сообщение от Catstail Посмотреть сообщение
Из кода это совсем не очевидно...
Почему не очевидно?
Вот же:
Цитата Сообщение от YuS_2 Посмотреть сообщение
arr = list(range(-(1*10**k)+1,-(1*10**(k - 1))+1)) + list(range(1*10**(k-1),1*10**k))
массив отрицательных и положительных чисел...

Добавлено через 50 секунд
при желании, там можно распечатать сами числа...
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38228 / 21160 / 4314
Регистрация: 12.02.2012
Сообщений: 34,774
Записей в блоге: 14
18.10.2025, 11:37
Цитата Сообщение от YuS_2 Посмотреть сообщение
Почему не очевидно?
Вот же:
- и что? Почему это выражение равно верному результату?

А мое решение я могу объяснить:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
k, n = map(int, input().split())
if n>k*9:
    print(0)
elif n==k*9:
    print(1)
else:
    q=0       # здесь будет результат
    v=[0]*k # начальные значения разрядов
    while True:
        if sum(v)==n and v[0] != 0: # берём только раскладки с нужной суммой и без первого незначащего нуля
            #print(v)
            q+=1 # копим результат
        # блок получения следующего числа
        i=0   # номер увеличиваемого разряда       
        while i<k:  # пока не вышли за пределы v
            if v[i]<9:  # очередной разряд можно увеличить
                v[i]+=1 # увеличиваем
                break
            else:        # очередной разряд = 9 - сбрасываем в нуль
                v[i]=0
                i+=1    # и переходим к следующему разряду
        if (i < k): # если еще не вышли за пределы числа
            continue
        break
    print(q)
При к=7 n=20 у меня ответ 139068

Да, если могут быть и отрицательные числа, то результат нужно просто умножить на 2
2
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
18.10.2025, 12:02
Цитата Сообщение от Catstail Посмотреть сообщение
Почему это выражение равно верному результату?
потому, что это прямой перебор массива чисел с вычислением суммы цифр каждого числа и проверкой суммы на условие с инкрементированием счетчика... да, медленно, даже очень медленно и решение в лоб, но это какое-никакое, но правильное решение. Это, кстати, решение ТС-а, я просто добавил необходимый массив чисел.
Для увеличения скорости, то бишь, исключения прямого перебора потребуется динамическое программирование с заполнением таблицы (k + 1) x (n + 1) ... что-то типа:
https://www.cyberforum.ru/cgi-bin/latex.cgi?arr[i][j] = \sum_{d=0}^{9}arr[i-1][j-1]
но, честно говоря, лень задумываться... если вдруг, кто-то заинтересуется, могу поподсказывать немного...
1
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
18.10.2025, 13:00
Цитата Сообщение от YuS_2 Посмотреть сообщение
Да и ещё в условиях нет упоминания о том, что числа десятичные и целые
Плюс ещё и поэтому задание является некорректным от а до я.
И решать его так же некорректно.

Но ты же набросился на красную тряпку и начал разглагольствовать о бесконечности про бесконечность.
И почему то набросился и на мой комментарий, который был как раз демонстрацией этой некорректности.
Но главное "быкануть" и доказывать своё слепое видение задачи)
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38228 / 21160 / 4314
Регистрация: 12.02.2012
Сообщений: 34,774
Записей в блоге: 14
18.10.2025, 13:49
Цитата Сообщение от YuS_2 Посмотреть сообщение
потому, что это прямой перебор массива
- Ваша правда!!! Не заметил в самом начале строки list!
0
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
18.10.2025, 14:06
Цитата Сообщение от Catstail Посмотреть сообщение
При к=7 n=20 у меня ответ 139068
Да, если могут быть и отрицательные числа, то результат нужно просто умножить на 2
По сути да, можно и *2
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def cntnum(k,n):
    def cntrec(x,s):
        if x == 0:
            return 1 if s == n else 0
        if s > n:
            return 0
        cnt = 0
        for d in range(10):
            cnt += cntrec(x-1, s+d)
        return cnt
    tcnt = 0
    for fd in range(1, 10):
        tcnt += cntrec(k-1, fd)
    return tcnt*2
 
a,b = map(int, input().split())
print(cntnum(a,b))
2
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,320
18.10.2025, 14:50
Catstail,
При к=7 n=20 у меня ответ 139068
У автора - 174195
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38228 / 21160 / 4314
Регистрация: 12.02.2012
Сообщений: 34,774
Записей в блоге: 14
18.10.2025, 15:05
Gdez, если брать дурацкие числа с незначащими нулями впереди, у меня получится столько же...

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
k, n = map(int, input().split())
if n>k*9:
    print(0)
elif n==k*9:
    print(1)
else:
    q=0
    v=[0]*k
    while True:
        if sum(v)==n: # and v[0] != 0:
            #print(v)
            q+=1
        i=0
        while i<k:
            if v[i]<9:
                v[i]+=1
                break
            else:
                v[i]=0
                i+=1
        if (i < k):
            continue
        break
    print(q)
2
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
18.10.2025, 17:22
Таки задача для долбодятликов. С нулями впереди у них это числа такие, N-значные.

Логика у автора задачи вышла в окно, как и у некоторых участников этой темы.
Gdez, тебе отдельное спасибо за ссылку.
Говнокурсы

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#include <unordered_map>
 
 // Custom hash_combine function (inspired by Boost)
 template <class T>
 inline void hash_combine(std::size_t& seed, const T& v) {
     std::hash<T> hasher;
     seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
 }
 
 // Specialization of std::hash for std::pair
 template <typename S, typename T>
 struct PHash{
     inline size_t operator()(const std::pair<S, T>& val) const {
         size_t seed = 0;
         hash_combine(seed, val.first);
         hash_combine(seed, val.second);
         return seed;
     }
 };
 
std::unordered_map<std::pair<long long, long long>, long long, PHash<long long, long long>> mem_count;
 
long long f_R(long long d, long long sum){
   if (d == 0 || sum < 0)
      return 0;
   if (d == 1)
      return sum < 10;
   {
      auto m = mem_count.find({d, sum});
      if (m != mem_count.end())
         return m->second;
   }
   long long cnt{0}; 
   for(long long i = 0; i != 10; ++i)
      cnt += f_R(d-1, sum - i);
   mem_count.insert({{d, sum}, cnt});
   return cnt;
}
 
// использовать f для подсчета натуральных чисел без значащих нулей
// но это не по ТЗ, которое там что то себе подразумевает
long long f(long long d, long long sum){
   long long cnt{0};
   for(long long i = 1; i != 10; ++i)
      cnt += f_R(d-1, sum - i);
   return cnt;
}
 
int main(){
   long long digits{0}, dsum{0};
   std::cin >> digits >> dsum;
   std::cout << f_R(digits, dsum)<< std::endl;
}
1
Вирусоборец
 Аватар для thyrex
14471 / 7510 / 1584
Регистрация: 06.09.2009
Сообщений: 27,196
18.10.2025, 17:55
Цитата Сообщение от SmallEvil Посмотреть сообщение
С нулями впереди у них это числа такие, N-значные
за то как элегантно можно срезать на ЕГЭ с такой задачей
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
18.10.2025, 18:04
Цитата Сообщение от thyrex Посмотреть сообщение
за то как элегантно можно срезать на ЕГЭ с такой задачей
Я всё это видел ещё в старших классах.
На областной олимпиаде по информатики(программирование).
Половину времени зовешь и ждешь инструкторов что бы пояснили задачу.
Это что то с чем то. И это у всех участников так было, а инструкторов 2-3 на всех (~50+/- участников).

Добавлено через 5 минут
Поправил функцию f для натуральных чисел и 0.
C++
1
2
3
4
5
6
7
8
long long f(long long d, long long sum){
   if (d == 1 && sum < 10)
      return 1;
   long long cnt{0};
   for(long long i = 1; i != 10; ++i)
      cnt += f_R(d-1, sum - i);
   return cnt;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.10.2025, 18:04

Является ли сумма цифр числа двухзначным числом / произведение цифр числа трехзначным числом
Дано трехзначное число. Определить: а) является ли сумма его цифр двухзначным числом; б) является...

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

Проверить, что сумма двух первых цифр заданного четырехзначного числа равна сумме двух его последних цифр.
Составить программу в Python, печатающие значение True, если указанное высказывание являются...

По заданному натуральному числу определить кол-во цифр в нём и сумму цифр на нечётных местах
Написать и протестировать функцию, которая по заданному натуральному числу определяет кол-во цифр в...

Программа, которая считывает n цифр, выбранных от 0 до 9, и печатает количество комбинаций, в которых сумма цифр равна другому заданному числу
- Программу, которая считывает n цифр, выбранных от 0 до 9, и печатает количество комбинаций, в...


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

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
После закрытия оутлука продолжает висеть процесс в диспетчере задач
Maks 27.10.2026
С недавнего времени в продакшене возникла проблема: при закрытии оутлука в диспетчере задач продолжал висеть процесс outlook. exe. Проблема возникла после установки MS Office 2021 LTSC на машинах, под. . .
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него. https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952 Инструкция внутри. https:/ / youtu. be/ VpfFZSUDGnQ. . .
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru