С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/55: Рейтинг темы: голосов - 55, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 19.12.2013
Сообщений: 23
1

Задача на рекурсию. Сколько существует k-значных натуральных чисел, сумма цифр которых равна s

05.11.2015, 22:16. Показов 10197. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задание (нужно выполнять рекурсией):

Даны натуральные числа k и s. Определите, сколько существует k-значных натуральных чисел,
сумма цифр которых равна s. Запись натурального числа не может начинаться с цифры 0.
В этой задаче можно использовать цикл для перебора всех цифр, стоящих на какой-либо
позиции.

Мои потуги:

Кликните здесь для просмотра всего текста

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
void funk(int k, int s,int i)
{
    int q = pow(10, k - 1);// возводим в степень k-1 для нахождения границы
    int chk = 0;
    int sum = 0;
    
    for (i; i < q; i++) //цикл перебора с i по q
    {
        sum += k % 10;
        k /= 10;// две строчки на нахождение сумы, вне рекурсии они работают 
        cout << i << " ";
        cout << sum << " ";
        if (s == sum)
        {
            cout << i;
            sum = 0;
            chk++;
            int a = i;
            funk(k, s, a);//стартуем рекурсию с места где закончили
        }
        else
        {
            int a = i;
            sum = 0;
            funk(k, s, a );//стартуем рекурсию с места где закончили
        }
 
        
    }
    cout << chk << endl;;



Может кто ни будь указать на мою ошибку/ подсказать идею. Буду благодарен.

Добавлено через 25 минут
up!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.11.2015, 22:16
Ответы с готовыми решениями:

Даны натуральные числа k и s. Определите, сколько существует k-значных натуральных чисел, сумма цифр которых равна d.
Даны натуральные числа k и s. Определите, сколько существует k-значных натуральных чисел, сумма...

Определить количество М-значных натуральных чисел, у которых сумма цифр, стоящих в нечетных разрядах, равна N
Определить количество М-значных натуральных чисел, у которых сумма цифр, стоящих в нечетных...

Сколько существует двухзначных, положительных чисел, сумма цифр которых равна 15
Подсчитать, сколько существует двухзначных, положительных чисел, сумма цифр которых равна 15....

Сколько существует 7-значных чисел, у которых сумма цифр равна 41?
Условие: Сколько существует 7-значных чисел, у которых сумма цифр равна 41? Число может начинаться...

19
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
05.11.2015, 22:24 2
Choppa, обязательно одной функцией? Можно сумму цифр числа сделать рекурсивной функцией, а поиск количества чисел сделать в другой функции через цикл, внутри которого будет вызываться первая функция.
0
0 / 0 / 0
Регистрация: 19.12.2013
Сообщений: 23
05.11.2015, 22:47  [ТС] 3
Kerry_Jr, Спасибо за идею, сейчас попробую.
0
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
06.11.2015, 00:08 4
Лучший ответ Сообщение было отмечено Choppa как решение

Решение

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int brute(int len, int sum, const int &k, const int &s) {
    if(len == k) {
        return sum == s;        
    }
 
    int c = (len == 0 ? 1 : 0);
    int res = 0;
    for(int i = c; i < 10; i++) {
        res += brute(len + 1, sum + i, k, s);
    }
 
    return res;
}
 
int main() {
        int k, s;
        cin >> k >> s;
        cout << brute(0, 0, k, s) << endl;
}
1
4820 / 2286 / 287
Регистрация: 01.03.2013
Сообщений: 5,970
Записей в блоге: 29
06.11.2015, 16:11 5
C++
1
2
3
4
int f(int l, int s, int d);
int loop(int l, int s, int i) {return i>=10 ? 0 : f(l,s-i,0)+loop(l,s,i+1);}
int f(int l, int s, int d) {return (l<0||s<0) ? 0 : s==0 ? 1 : loop(l-1,s,d);}
int main() {int k,s; cin>>k>>s; cout<<f(k,s,1)<<'\n'; return 0;}
Но лучше еще добавить мемоизацию.
0
kalonord
06.11.2015, 16:16
  #6

Не по теме:

_Ivana, а вообще это считается нормальным оформлением кода? Так то компактно вроде :)

0
4820 / 2286 / 287
Регистрация: 01.03.2013
Сообщений: 5,970
Записей в блоге: 29
06.11.2015, 16:37 7

Не по теме:

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



Добавлено через 12 минут
А такой кот считает мгновенно на неприличных числах, которые сами не влезут в uint64:
C++
1
2
3
4
5
6
7
8
9
10
typedef unsigned long long int ull;
ull dp[200][2000][2];
ull f(int l, int s, int d);
ull loop(int l, int s, int i) {return i>=10 ? 0 : f(l-1,s-i,0)+loop(l,s,i+1);}
ull f(int l, int s, int d) {
    if (l<0||s<0||s>l*9) return 0;
    else if (s==0) return 1;
    else {if (dp[l][s][d]==0) dp[l][s][d]=loop(l,s,d); return dp[l][s][d];}
}
int main() {int k,s; cin>>k>>s; cout<<f(k,s,1)<<'\n'; return 0;}
Код
60 400
15872296285163377078
3
Модератор
Эксперт CЭксперт С++
5286 / 2373 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
06.11.2015, 17:13 8
Цитата Сообщение от kalonord Посмотреть сообщение
вообще это считается нормальным оформлением кода?
Вообще-то, правило хорошего оформления кода: один оператор (statement) - одна строчка (это в любой книжке по C++ для начинающих есть). Но _Ivana пишет так, как ему удобно, общепринятые правила ему до лампочки. За это ему уже тут пеняли неоднократно, но он упорствует в своей ереси

Добавлено через 1 минуту
Цитата Сообщение от _Ivana Посмотреть сообщение
Мне мои однострочники легко и прозрачно читать, хотя тут неоднократно пытались ныть по их поводу.
И правильно ныли. Твои однострочники - это страшная вырвиглазная какашка. И если для лямбд это ещё хоть как-то оправданно, то твой мэйн - это просто
2
2686 / 2258 / 244
Регистрация: 03.07.2012
Сообщений: 8,216
Записей в блоге: 1
06.11.2015, 17:14 9
А меня больше напрягает не одна строчка, а то, что нет описания переменных и что делает функция.
0
4820 / 2286 / 287
Регистрация: 01.03.2013
Сообщений: 5,970
Записей в блоге: 29
06.11.2015, 17:17 10
gru74ik, я тебе уже предлагал дельный вариант - написать автоформаттер котов С любыми устраивающими тебя правилами форматирования результирующего текста, а лучше - задаваемыми в файле настройки-конфига в виде шаблонов. И практика была бы, и глаза остались на месте Но ты проигнорировал.
0
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
06.11.2015, 17:19 11
Цитата Сообщение от _Ivana Посмотреть сообщение
dp[l][s][d]
я понял, откуда берутся эти "дайте-вилку-я-выколю-себе-глаза"-однострочники
2
Модератор
Эксперт CЭксперт С++
5286 / 2373 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
06.11.2015, 17:20 12
В приличном обществе пишут примерно так:
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
typedef unsigned long long int ull;
 
ull dp[200][2000][2];
 
ull f(int l, int s, int d);
ull loop(int l, int s, int i);
 
int main()
{
    int k,s;
    cin >> k >> s;
    cout << f(k, s, 1) << '\n';
    return 0;
}
 
ull f(int l, int s, int d)
{
    if (l<0 || s<0 || s>l*9)
        return 0;
    else if (s==0)
        return 1;
    else
    {
        if (dp[l][s][d]==0)
            dp[l][s][d] = loop(l, s, d);
        return dp[l][s][d];
    }
}
 
ull loop(int l, int s, int i)
{
    return i >= 10 ? 0 : f(l-1, s-i, 0) + loop(l, s, i+1);
}
kalonord, но _Ivana - известный бунтарь и вольнодумец, он рождён, чтоб сотрясать устои
0
4820 / 2286 / 287
Регистрация: 01.03.2013
Сообщений: 5,970
Записей в блоге: 29
06.11.2015, 17:22 13
Ну этож кодеарт В моем тетрисе, например:
makeGS f i r s t = GameState { field = f, item = i, run = r, score = s, timerDelay = t }
0
Модератор
Эксперт CЭксперт С++
5286 / 2373 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
06.11.2015, 17:24 14
Цитата Сообщение от zer0mail Посмотреть сообщение
нет описания переменных и что делает функция.
Имена функций и переменных - это тема для отдельного разговора. Но да, соглашусь, у _Ivana они тоже прекрасны. Сразу видно, что человек начал с Си и закончил любовью к ФЯП

Добавлено через 1 минуту
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
я понял, откуда берутся
На свет лезут
0
4820 / 2286 / 287
Регистрация: 01.03.2013
Сообщений: 5,970
Записей в блоге: 29
06.11.2015, 17:26 15
На работе, кстати, я переменные называю примерно так: ВременнаяТаблицаПромежуточныхИтоговДляСвертки.
0
Модератор
Эксперт CЭксперт С++
5286 / 2373 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
06.11.2015, 17:31 16
kalonord, да, в защиту _Ivana скажу, что парень он незлобивый, весёлый, пишет на нескольких разных языках программирования и не только HelloWorld'ы (как я, например).

Добавлено через 4 минуты
Цитата Сообщение от _Ivana Посмотреть сообщение
я тебе уже предлагал дельный вариант - написать автоформаттер котов
Знаний у меня маловато для решения такой задачи. Это ты у нас Федот-стрелец, удалой молодец, а я пока только букварь ещё дочитываю.
1
4820 / 2286 / 287
Регистрация: 01.03.2013
Сообщений: 5,970
Записей в блоге: 29
06.11.2015, 17:36 17
gru74ik, я на полном серьезе. Я не против того, чтобы ты и дальше читал буквари, более того - это занятие увлекательное и полезное (порой такое прочитаешь, о чем и не догадывался), но не только же буквари читать - надо еще и в открытое море реальной жизни выходить А это реальный и забавный проектик, вполне тебе по силам, проверять его можно на любых местных кодах - от моих, до MrX, заодно получишь опыт написания не хелловорлдов сферических, а если с какими трудностями столкнешься - здесь же и спросишь. Хватит уже буквари читать - ты их так всю жизнь читать будешь.
0
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
06.11.2015, 17:41 18
_Ivana, ты и MrX - две противоположности, два сапога пара и т.д. и т.п.
0
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
02.12.2020, 07:12 19
А как, например, найти результат, для большИх чисел по остатку (по модулю).
Этот код ничего не выдает при 1000 8999. Почему?
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
#include <iostream>
using namespace std;
typedef unsigned long long int ull;
ull dp[1000][9000][2];
ull f(int, int, int);
ull loop(int l, int s, int i)
{
    if (i>=10)
    {
        return 0;
    }
    else 
    { 
        return f(l-1,s-i,0)+loop(l,s,i+1);
    }
}
ull f(int l, int s, int d)
{
    if (l<0||s<0||s>l*9) return 0;
    else if (s==0) return 1;
    else 
    {
        if (dp[l][s][d]==0)
        {
            dp[l][s][d]=loop(l,s,d);
        }
    return dp[l][s][d];
    }
}
int main()
{
    int n,s;
    std::cin>>n>>s;
    if (s==n*9 || s==1)
        cout<<1;
    else
        cout<<f(n,s,1)%1000000000;
    return 0;
}
P.S. лучше позже спросить, чем никогда
0
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
04.12.2020, 04:52 20
И вообще какая-то мистика происходит: то выдает резльтат для 1000 2576, то не выдает. (с непонятной регулярностью)
0
04.12.2020, 04:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.12.2020, 04:52
Помогаю со студенческими работами здесь

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

Определить количество M-значных натуральных чисел у которых сумма цифр стоящих на нечетных разрядах равна N
Привет всем! Помогите пожалуйста написать программу и составить схему алгоритма по следующему...

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

Существует ли такая четвёрка последовательных натуральных чисел,сумма квадратов которых равна сумме квадратов трёх следующих натуральных чисел
Помогите с задачами пожалуйста!!! задача 2. Определить,существует ли такая четвёрка...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru