Найти все варианты размещения знаков арифметических операций на месте вопросительных знаков в выражении - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Составить программу, которая бы нашла все варианты размещения знаков арифметических операций +,-,* на месте вопросительных знаков в выражении 1?2?3?4?5?6?7?8?9?9, что значение этого выражения равнялось бы 100. Арифметические действия выполняются слева направо, а не по обычному приоритету.

Решение задачи: «Найти все варианты размещения знаков арифметических операций на месте вопросительных знаков в выражении»

textual
Листинг программы
#include <stdio.h>
 
#define VALUES_COUNT (10)
#define OPERATORS_COUNT ( (VALUES_COUNT) - 1 )
 
enum OPERATOR_TYPES { OT_PLUS = 0, OT_MINUS, OT_MUL, ALL_OPERATOR_TYPES };
 
int plus(int a, int b) { return a + b; }
int minus(int a, int b) { return a - b; }
int mul(int a, int b) { return a * b; }
 
const char OPERATOR_SIGNS[ALL_OPERATOR_TYPES] = { '+', '-', '*' };
 
typedef int (*opfunc_t)(int, int);
 
opfunc_t OPERATOR_FUNCTIONS[ALL_OPERATOR_TYPES] = { plus, minus, mul };
 
int main(void) {
    int values[VALUES_COUNT] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 9 };
    int operators[OPERATORS_COUNT] = { 0 };
    int needed_result = 100;
    int i, stop, result, solutions;
    
    solutions = 0;
    stop = 0;
    while ( ! stop ) {
        result = values[0];
        for ( i = 0; i < OPERATORS_COUNT; ++i )
            result = OPERATOR_FUNCTIONS[operators[i]](result, values[i + 1]);
            
        if ( result == needed_result ) {
            printf("Solution #%d: ", ++solutions);
            for ( i = 0; i < VALUES_COUNT; ++i )
                printf("%d %c ", values[i], ( i < OPERATORS_COUNT ) ? OPERATOR_SIGNS[operators[i]] : '=');
            printf("%d\n", result);
        }
        
        for ( i = 0; i < OPERATORS_COUNT; ++i ) {
            operators[i] += 1;
            if ( operators[i] == ALL_OPERATOR_TYPES ) {
                if ( i == OPERATORS_COUNT - 1 ) {
                    stop = 1;
                    break;
                }
                operators[i] = OT_PLUS;
            }
            else
                break;
        }
    }
    
    return 0;
}

Объяснение кода листинга программы

  1. Включаем заголовочный файл stdio.h для использования функций ввода-вывода
  2. Определяем макрос VALUES_COUNT, который задает количество значений в массиве (10)
  3. Определяем макрос OPERATORS_COUNT, который вычисляет количество операторов, вычитая 1 из значения VALUES_COUNT
  4. Создаем перечисление OPERATOR_TYPES для определения типов операторов
  5. Определяем функции-операторы plus, minus, mul для выполнения арифметических операций
  6. Создаем массив OPERATOR_SIGNS, который содержит символы операторов для каждого типа
  7. Создаем массив OPERATOR_FUNCTIONS, который содержит указатели на функции-операторы для каждого типа
  8. В функции main создаем массив значений values и операторов operators, инициализируем его значениями
  9. Устанавливаем переменную needed_result равной 100 (это пример, в реальном приложении это может быть любое другое число)
  10. Инициализируем переменные i, stop, result и solutions нулевыми значениями
  11. В цикле while проверяем, остановился ли процесс перебора операторов. Если остановился, то выводим результат на экран
  12. Во внутреннем цикле for перебираем операторы и применяем их к результату
  13. Если результат соответствует needed_result, то выводим на экран сообщение о найденном решении
  14. Во внутреннем цикле for увеличиваем значения операторов на 1
  15. Если значение оператора достигло ALL_OPERATOR_TYPES, то сбрасываем его обратно в OT_PLUS и выходим из цикла с помощью оператора break
  16. Если значение оператора не достигло ALL_OPERATOR_TYPES, то прерываем внутренний цикл с помощью оператора break
  17. В конце функции main возвращаем 0, чтобы указать, что программа успешно завершилась

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


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

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

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