Найти все варианты размещения знаков арифметических операций на месте вопросительных знаков в выражении - 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, чтобы указать, что программа успешно завершилась
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д