Вывести всевозможные комбинации из 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, чтобы избежать сообщения об ошибке от библиотеки стандартного ввода/вывода.