Вывести на экран (по одному разу) все последовательности длиной 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). Он предназначен для сортировки массива строк, но в данном случае используется для сортировки массива массивов.

  1. Создается массив размером N x k, где N - количество строк, k - длина последовательности.
  2. В первой строке каждой строки массива устанавливается 0.
  3. Затем во внутреннем цикле заполняются оставшиеся элементы каждой строки. Начинается с 1 и увеличивается на 1 с каждой итерацией. Цикл продолжается, пока не будут заполнены все элементы строки или не будет достигнут размер массива.
  4. Во внешнем цикле происходит сортировка каждой строки массива. Сначала создается временный массив той же длины, что и строка. Затем в цикле while проверяется, является ли текущая строка уже отсортированной (если все элементы равны). Если это не так, то выполняется обмен элементов и проверяется, является ли строка отсортированной после обмена. Если это так, то переменная b устанавливается в true и цикл прерывается. Затем выводится отсортированная строка.
  5. В конце программы выводится количество отсортированных строк. Временная сложность алгоритма сортировки подсчетом O(n+k*log(k)).

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


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

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

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