Рекурсия. Комбинация возможного бинарного кода - C (СИ)
Формулировка задачи:
Доброго времени суток! Задачка, составить список комбинации с помощью рекурсии.
Пример:
1)0110
0110
2)01x0
0100
0110
3) xx
00
01
10
11
4)101x100x11x
10101000110
10101000111
10101001110
10101001111
10111000110
10111000111
10111001110
10111001111
Но проблема в том, что первые числа не выводятся в формате, т.е. у меня так
"0
1
10..."
а нужно "
000
001
010..."
и т.д.
И подойдет ли этот алгоритм для решения задачи??
Ну или хотя бы сделать так, а дальше доработать:
вводим кол-во чисел: 3
000
001
010
...
110
111
Открыт для любых идеи
Ну или хотя бы сделать так, а дальше доработать:
вводим кол-во чисел: 3
000
001
010
...
110
111
Ну же, кто- нибудь!
Придумал следующее: Переводить из 10 в 2
#include <stdio.h> #include <string.h> #include <malloc.h> #include <math.h> char * decToBin(int x) { char *t = (char *)malloc(100); int i = 0; do { t[i++] = x % 2 + '0'; x = x / 2; } while (x != 0); t[i] = '\0'; // ??????????? t int k = strlen(t) - 2; int m = k / 2; for (int i = 0; i <= m; i++) { char tmp = t[i]; t[i] = t[k - i + 1]; t[k - i + 1] = tmp; } return t; } int main() { int x,exp; scanf("%d", &exp); for( int x=0; x<pow(2,exp); ++x) { char *t = decToBin(x); printf("%s\n",t); } }
Решение задачи: «Рекурсия. Комбинация возможного бинарного кода»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <string.h> void _perm(int* to_permute, int len, int* current_perm, int max_len); void perm(int* list, int len){ _perm(list, len, list, len); } void _perm(int* to_permute, int len, int* current_perm, int max_len){ int i; if(len == 1){ for(i = 0; i < max_len; i++){ printf("%d ", current_perm[i]); } printf("\n"); } else{ for(i = 0; i < len; i++){ /*создаю временную копию строки (temp) с той же самой длиной устанавливаю первую х в строке на '0'; вызываю рекурсию проходящую в новую модифицированную строку temp устанавливаю первую х в строке на '0'; вызываю рекурсию проходящую в новую модифицированную строку temp вид вызовы рекурсии " _perm(to_permute + 1, len -1, current_perm, max_len);" */ } } } int main(){ int nums[10]; scanf("%s", nums); int z = strlen(nums); perm(nums, z); return 0; }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы
- Определяем функцию _perm, которая принимает следующие параметры:
- to_permute: указатель на массив, который нужно переставить
- len: длина массива to_permute
- current_perm: указатель на текущую перестановку массива
- max_len: максимальная длина текущей перестановки
- Если len == 1, выводим текущую перестановку на экран
- В противном случае, создаем временную копию массива to_permute и присваиваем ей значение '0'
- Рекурсивно вызываем функцию _perm для новой модифицированной перестановки
- Устанавливаем первую позицию в текущей перестановке на '0'
- Рекурсивно вызываем функцию _perm для новой модифицированной перестановки
- Повторяем шаги 4-7 для каждого элемента массива to_permute
- Определяем функцию perm, которая принимает массив и его длину в качестве параметров
- Вызываем функцию _perm, передавая ей массив, его длину, указатель на текущую перестановку и максимальную длину текущей перестановки
- Вводим строку с помощью функции scanf
- Вычисляем длину строки
- Вызываем функцию perm, передавая ей введенную строку и ее длину
- Возвращаем 0, чтобы указать, что программа успешно завершилась
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д