Вывести на экран (по одному разу) все последовательности длиной 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)).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д