Вывести всевозможные комбинации из n-чисел размером k - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Вводим в программе n и k n - кол-во цифр (1, 2, 3,...,n) k - длинна выводимой комбинации (если k=3, то должны получать 123, 124, 125..и тд) Цифры в комб. должны идти по возростанию Через итерацию либо рекурсию нужно проделать вывод всех возможных таких комбинаций Понятное дело что код нужно строить через внутренние цыклы, но у меня руки дошли писать кол-во циклов равное k
for (int i = 1; i < 10; i++)
  for (int j = i + 1; j < 10; j++)
    for (int k = j + 1; k < 10; k++)
      printf("%d%d%d \n", i, j, k);
Нужно универсальный код для всех k и n Буду крайне благодарен за помощь

Решение задачи: «Вывести всевозможные комбинации из n-чисел размером k»

textual
Листинг программы
#include <stdio.h>
 
const int n1=20;
int k,n,a[n1],p[n1];
 
void cnk(int m,int l) {
 //m-сколько осталоась выбрать,l - номер элемента с которого начниаем
 int i,j;
 if (m==0) { //Здесь - обработка комбинации
  printf ("\n");
  for (j=0;j<k;j++) printf ("%d ",p[j]);
 }
 else for (i=l;i<=n-m;i++) {
   p[k-m]=a[i];
   cnk(m-1,i+1);
 }
}
 
int main ()  {
 printf ("\nПодмножества из N по K");
 printf ("\nВведите N (2-%d):",n1);
 fflush (stdin);
 scanf("%d",&n);
 printf ("\nВведите K:");
 fflush (stdin);
 scanf("%d",&k);
 for (int i=0;i<n;i++) a[i]=i+1; //данный массив может быть заполнен произвольно
 cnk(k,0);
 fflush (stdin); getchar();
}

Объяснение кода листинга программы

Вот что делает этот код:

  1. Включает стандартную библиотеку, которая содержит функции для ввода и вывода данных.
  2. Определяет константы : n1 - это максимально допустимое значение для n и k, а k - это размер подмножества.
  3. Определяет переменные : n, k, a[n1] и p[n1]. Переменная n используется для хранения количества элементов в массиве a. Переменная k используется для хранения размера подмножества. Массив a используется для хранения элементов, из которых выбираются подмножества. Массив p используется для хранения выбранных элементов.
  4. Определяет функцию cnk, которая генерирует все возможные подмножества заданного размера из массива a. Эта функция использует рекурсию, чтобы перебрать все возможные комбинации. Если m равно 0, то функция выводит текущую комбинацию на экран. В противном случае она перебирает все возможные значения i от l до n-m и добавляет a[i] в p, вызывая функцию cnk для m-1 и i+1.
  5. Основная функция main запрашивает у пользователя значения n и k, а затем инициализирует массив a значениями от 1 до n.
  6. Вызывает функцию cnk с аргументами k и 0, чтобы начать генерацию подмножеств.
  7. Очищает буфер ввода с помощью fflush и getchar, чтобы избежать сообщения об ошибке от библиотеки стандартного ввода/вывода.

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


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

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

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