Упростить код перебора комбинаций - C (СИ)
Формулировка задачи:
Дан код перебора комбинаций 4 символов, его необходимо упростить, что бы была возможность перебора комбинаций из n-символов.
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
FILE * out = fopen("out.txt", "w");
int main()
{
int a[4], z = 0, y = 0, x = 0, w = 0, v = 0;
for(z = 33; z <= 126; ++z)
{
a[0] = z;
for(y = 33; y <= 126; ++y)
{
a[1] = y;
for(x = 33; x <= 126; ++x)
{
a[2] = x;
for(w = 33; w <= 126; ++w)
{
a[3] = w;
printf("%d %d %d %d\n", a[0], a[1], a[2], a[3]);
fputc(a[0], out);
fputc(a[1], out);
fputc(a[2], out);
fputc(a[3], out);
fputc(10, out);
}
}
}
}
return 0;
}Решение задачи: «Упростить код перебора комбинаций»
textual
Листинг программы
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define len 2
#define min 48 //Минимальный код
#define max 57 //Максимальный код
int main()
{
char str[len + 1];
str[len] = '\0';
for (int i = 0; i < len; i++)
str[i] = min;
printf("%s\n", str);
while (1)
{
int accum = 1;
for (int i = len - 1; accum > 0; i--)
{
if (str[i] == max)
{
if (i != 0)
str[i] = min;
else
str[i]++;
}
else
{
str[i]++;
accum = 0;
}
}
if (str[0] == max + 1)
break;
printf("%s\n", str);
}
system("pause");
return 0;
}
Объяснение кода листинга программы
Вывод всех возможных комбинаций строки из min до max, где длина строки равна len.
- Объявить переменную типа char массив str с длиной len + 1 и инициализировать его последним символом '\0'.
- Заполнить строку str значением min.
- Вывести значение переменной str с помощью функции printf.
- Запустить бесконечный цикл while (1).
- Внутри цикла иметь переменную accum, которая инициализируется значением 1.
- Внутренний цикл for, который итерируется от len - 1 до 0 с шагом -1, пока accum больше 0.
- Если значение str[i] равно max, то уменьшить значение str[i] на 1, если i не равно 0.
- Если значение str[i] не равно max, то увеличить значение str[i] на 1 и установить accum равным 0.
- Если accum равно 0, то выйти из внутреннего цикла.
- Если значение str[0] равно max + 1, то выйти из внешнего цикла.
- Вывести значение переменной str с помощью функции printf.
- Использовать функцию system(
pause) для приостановки программы до нажатия клавиши. - Вернуть 0 для завершения программы.