Вывести всевозможные комбинации из n-чисел размером k - C (СИ)
Формулировка задачи:
Вводим в программе n и k
n - кол-во цифр (1, 2, 3,...,n)
k - длинна выводимой комбинации
(если k=3, то должны получать 123, 124, 125..и тд)
Цифры в комб. должны идти по возростанию
Через итерацию либо рекурсию нужно проделать вывод всех возможных таких комбинаций
Понятное дело что код нужно строить через внутренние цыклы, но у меня руки дошли писать кол-во циклов равное k
Нужно универсальный код для всех k и n
Буду крайне благодарен за помощь
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);
Решение задачи: «Вывести всевозможные комбинации из 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(); }
Объяснение кода листинга программы
Вот что делает этот код:
- Включает стандартную библиотеку, которая содержит функции для ввода и вывода данных.
- Определяет константы :
n1
- это максимально допустимое значение дляn
иk
, аk
- это размер подмножества. - Определяет переменные :
n
,k
,a[n1]
иp[n1]
. Переменнаяn
используется для хранения количества элементов в массивеa
. Переменнаяk
используется для хранения размера подмножества. Массивa
используется для хранения элементов, из которых выбираются подмножества. Массивp
используется для хранения выбранных элементов. - Определяет функцию
cnk
, которая генерирует все возможные подмножества заданного размера из массиваa
. Эта функция использует рекурсию, чтобы перебрать все возможные комбинации. Еслиm
равно 0, то функция выводит текущую комбинацию на экран. В противном случае она перебирает все возможные значенияi
отl
доn-m
и добавляетa[i]
вp
, вызывая функциюcnk
дляm-1
иi+1
. - Основная функция
main
запрашивает у пользователя значенияn
иk
, а затем инициализирует массивa
значениями от 1 доn
. - Вызывает функцию
cnk
с аргументамиk
и 0, чтобы начать генерацию подмножеств. - Очищает буфер ввода с помощью
fflush
иgetchar
, чтобы избежать сообщения об ошибке от библиотеки стандартного ввода/вывода.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д