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