Рекурсия: поиск количества счастливых билетов - C (СИ)
Формулировка задачи:
Нужно составить программу по поиску количества счастливых билетов, состоящих из шестизначного числа (сумма первых трех цифр равна сумме последних трёх). Но нужно все это организовать с использованием рекурсии. Приблизительно написал код, но вылетает программа! Не могу понять почему, то ли дело в цикле for, но тогда как проверить все варианты чисел...
Help!
#include <stdio.h> #include <locale.h> #include <conio.h> #include <stdlib.h> void recur(); char *mas; int kol = 0; void recur() { int i, j, k; mas = (char*)malloc(6*sizeof(char)); for(i = 0; i <= 999999; i++) { for (k = i, j = 0; j < 6; j++, k /= 10) { *(mas+j) = k % 10; } if (*(mas+0)+*(mas+1)+*(mas+2) != *(mas+3)+*(mas+4)+*(mas+5)) { recur(); } else kol++; } } int main() { setlocale(LC_ALL, "Russian"); recur(); printf("Количество счастливых билетов: %d", kol); return 0; free(mas); }
Решение задачи: «Рекурсия: поиск количества счастливых билетов»
textual
Листинг программы
#include <stdio.h> void iterate(int depth, int max_depth, int n) { // максимально число разрядов равно 6, но при желании его можно увеличить static int v[6] = {0}; if (depth == max_depth) // если заполнены все разряды, выводим комбинацию на экран { for (int i=0; i<depth; i++) printf("%d ", v[i]); printf("\n"); } else { // перебираем все цифры текущего разряда ... for (int d = 0; d < n; d++) { v[depth] = d; // ... и переходим к следующему разряду (к следующему уровню рекурсии) iterate(depth+1, max_depth, n); } } } int main() { iterate(0, 3, 2); printf("\n======\n\n"); iterate(0, 2, 4); }
Объяснение кода листинга программы
В данном коде реализована рекурсивная функция для поиска всех возможных комбинаций чисел от 1 до n в заданном количестве разрядов (depth). В основе алгоритма лежит принцип динамического программирования с использованием массива v, в котором на каждом уровне (depth) хранится текущая комбинация чисел.
- В функции iterate определены три параметра:
- depth - текущая глубина (количество разрядов),
- max_depth - максимальная глубина (количество разрядов),
- n - количество цифр в каждом разряде.
- Массив v объявлен статическим для экономии памяти. Он содержит n элементов, каждый из которых инициализируется нулем.
- Если глубина равна максимальной глубине, то выводится текущая комбинация чисел.
- В противном случае, перебираются все возможные цифры для текущего разряда и вызывается рекурсивная функция с увеличенной глубиной.
- В функции main вызывается функция iterate с двумя аргументами:
- первый аргумент - глубина равна 0,
- второй аргумент - максимальная глубина равна 3,
- третий аргумент - количество цифр в каждом разряде равно 2.
- Затем выводится комбинация чисел для следующего случая: глубина равна 0, максимальная глубина равна 2, количество цифр в каждом разряде равно 4.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д