Рекурсия: поиск количества счастливых билетов - 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) хранится текущая комбинация чисел.

  1. В функции iterate определены три параметра:
    • depth - текущая глубина (количество разрядов),
    • max_depth - максимальная глубина (количество разрядов),
    • n - количество цифр в каждом разряде.
  2. Массив v объявлен статическим для экономии памяти. Он содержит n элементов, каждый из которых инициализируется нулем.
  3. Если глубина равна максимальной глубине, то выводится текущая комбинация чисел.
  4. В противном случае, перебираются все возможные цифры для текущего разряда и вызывается рекурсивная функция с увеличенной глубиной.
  5. В функции main вызывается функция iterate с двумя аргументами:
    • первый аргумент - глубина равна 0,
    • второй аргумент - максимальная глубина равна 3,
    • третий аргумент - количество цифр в каждом разряде равно 2.
  6. Затем выводится комбинация чисел для следующего случая: глубина равна 0, максимальная глубина равна 2, количество цифр в каждом разряде равно 4.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.556 из 5
Похожие ответы