Вывести на экран (по одному разу) все последовательности длиной k, образованные из чисел - C (СИ)
Формулировка задачи:
Помогите написать програму!!
Определить и вывести на экран (по одному разу) все последовательности длиной k, образованные из чисел 1,2, ..., n (k, n-натуральное число, k <= n). Последовательности не обязательно упорядочены, числа в середине последовательности немогут повторятся. Разработать рекурсивнийта нерекурсивный варианты программы!
Последовательности не непременно упорядочены, числа в середине последовательности немогут повторятся. Разработать рекурсивный и НЕ рекурсивный варианты программы!
Помогите написать прогу.
Написал штото такое, но ето не то, виводит неверно.
#include <stdio.h>
#include <conio.h>
int factorial(int n);
int main()
{
//clrscr();
int i,j,j1,n,temp,k,k1=0,linecount=0;
int a[10];
char c=' ';
printf("Enter N-");
scanf("%i",&n);
printf("Enter K-");
scanf("%i",&k);
printf("Start vector: ");
for(i=0;i<n;i++)
{
a[i]=i+1;
printf("%i ",a[i]);
}
printf("\perestanovoku\n");
for(i=0;i<n;i++)
{
for(j=0;j<n-1;j++)
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
for(j1=0;j1<k;j1++)
{
printf("%i ",a[j1]);
}
printf("\n");
if(linecount>20)
{
printf("Dlj prodolzenij nazmite na lybyy klavushy");
getch();
linecount=0;
}else{
linecount++;
}
}
}
getch();
return 0;
}
Помогите написать прогу.
Написал штото такое, но ето не то, виводит неверно.
#include <stdio.h>
#include <conio.h>
int factorial(int n);
int main()
{
//clrscr();
int i,j,j1,n,temp,k,k1=0,linecount=0;
int a[10];
char c=' ';
printf("Enter N-");
scanf("%i",&n);
printf("Enter K-");
scanf("%i",&k);
printf("Start vector: ");
for(i=0;i<n;i++)
{
a[i]=i+1;
printf("%i ",a[i]);
}
printf("\perestanovoku\n");
for(i=0;i<n;i++)
{
for(j=0;j<n-1;j++)
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
for(j1=0;j1<k;j1++)
{
printf("%i ",a[j1]);
}
printf("\n");
if(linecount>20)
{
printf("Dlj prodolzenij nazmite na lybyy klavushy");
getch();
linecount=0;
}else{
linecount++;
}
}
}
getch();
return 0;
}Решение задачи: «Вывести на экран (по одному разу) все последовательности длиной k, образованные из чисел»
textual
Листинг программы
#include <stdio.h>
#include <conio.h>
#define N 100
const int k = 5;
void swap(int& n1, int& n2);
bool issorted(int* A, int* tmp, int size);
int main(int argc, char* argv[])
{
int A[N][k] = { { 0 } };
for (int t = 1; t < N; t++)
{
int i = 0; int n = t;
while (i < k && n < N) A[t-1][i++] = n++;
}
for (int r = 0; r < N; r++)
{
int* tmp = new int[k]; bool b = false;
memcpy((void*)tmp, (void*)A[r], sizeof(int) * k);
int n = 0;
while (tmp[n] != 0) n++;
if (n <= k-1) continue;
for (int w = 0; w < k; w++)
printf("%d ",tmp[w]);
printf("\n\n");
do {
for (int s = 0; s < k-1 && !b; s++)
{
swap(A[r][s], A[r][s+1]);
if (issorted(A[r],tmp,k)) { b = true; continue; }
for (int l = 0; l < k; l++)
printf("%d ",A[r][l]);
printf("\n");
}
} while (b == false);
printf("\n");
}
_getch();
return 0;
}
void swap(int& n1, int& n2)
{ int _tn = n1; n1= n2; n2 = _tn; }
bool issorted(int* A, int* tmp, int size)
{
for (int i = 0; i < size; i++)
if (A[i] != tmp[i]) return false;
return true;
}
Объяснение кода листинга программы
В этом коде используется алгоритм сортировки подсчетом (counting sort). Он предназначен для сортировки массива строк, но в данном случае используется для сортировки массива массивов.
- Создается массив размером N x k, где N - количество строк, k - длина последовательности.
- В первой строке каждой строки массива устанавливается 0.
- Затем во внутреннем цикле заполняются оставшиеся элементы каждой строки. Начинается с 1 и увеличивается на 1 с каждой итерацией. Цикл продолжается, пока не будут заполнены все элементы строки или не будет достигнут размер массива.
- Во внешнем цикле происходит сортировка каждой строки массива. Сначала создается временный массив той же длины, что и строка. Затем в цикле while проверяется, является ли текущая строка уже отсортированной (если все элементы равны). Если это не так, то выполняется обмен элементов и проверяется, является ли строка отсортированной после обмена. Если это так, то переменная b устанавливается в true и цикл прерывается. Затем выводится отсортированная строка.
- В конце программы выводится количество отсортированных строк. Временная сложность алгоритма сортировки подсчетом O(n+k*log(k)).