Упростить код перебора комбинаций - 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.

  1. Объявить переменную типа char массив str с длиной len + 1 и инициализировать его последним символом '\0'.
  2. Заполнить строку str значением min.
  3. Вывести значение переменной str с помощью функции printf.
  4. Запустить бесконечный цикл while (1).
  5. Внутри цикла иметь переменную accum, которая инициализируется значением 1.
  6. Внутренний цикл for, который итерируется от len - 1 до 0 с шагом -1, пока accum больше 0.
  7. Если значение str[i] равно max, то уменьшить значение str[i] на 1, если i не равно 0.
  8. Если значение str[i] не равно max, то увеличить значение str[i] на 1 и установить accum равным 0.
  9. Если accum равно 0, то выйти из внутреннего цикла.
  10. Если значение str[0] равно max + 1, то выйти из внешнего цикла.
  11. Вывести значение переменной str с помощью функции printf.
  12. Использовать функцию system(pause) для приостановки программы до нажатия клавиши.
  13. Вернуть 0 для завершения программы.

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


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

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

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