Найти все варианты размещения знаков арифметических операций на месте вопросительных знаков в выражении - 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;
}
Объяснение кода листинга программы
- Включаем заголовочный файл stdio.h для использования функций ввода-вывода
- Определяем макрос VALUES_COUNT, который задает количество значений в массиве (10)
- Определяем макрос OPERATORS_COUNT, который вычисляет количество операторов, вычитая 1 из значения VALUES_COUNT
- Создаем перечисление OPERATOR_TYPES для определения типов операторов
- Определяем функции-операторы plus, minus, mul для выполнения арифметических операций
- Создаем массив OPERATOR_SIGNS, который содержит символы операторов для каждого типа
- Создаем массив OPERATOR_FUNCTIONS, который содержит указатели на функции-операторы для каждого типа
- В функции main создаем массив значений values и операторов operators, инициализируем его значениями
- Устанавливаем переменную needed_result равной 100 (это пример, в реальном приложении это может быть любое другое число)
- Инициализируем переменные i, stop, result и solutions нулевыми значениями
- В цикле while проверяем, остановился ли процесс перебора операторов. Если остановился, то выводим результат на экран
- Во внутреннем цикле for перебираем операторы и применяем их к результату
- Если результат соответствует needed_result, то выводим на экран сообщение о найденном решении
- Во внутреннем цикле for увеличиваем значения операторов на 1
- Если значение оператора достигло ALL_OPERATOR_TYPES, то сбрасываем его обратно в OT_PLUS и выходим из цикла с помощью оператора break
- Если значение оператора не достигло ALL_OPERATOR_TYPES, то прерываем внутренний цикл с помощью оператора break
- В конце функции main возвращаем 0, чтобы указать, что программа успешно завершилась