Заданы цифры - расставить знаки сложения и вычитания так, чтобы получилось выражение с заданным результатом - C (СИ)

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

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

Здравствуйте, задали домашнее задание. Имеются цифры 1, 2, 3, 4, 5, 6, 7, 8, 9. Необходимо расставить между ними любое количество знаков "плюс" или "минус" так, чтобы получить выражение результат которого равен 100. Например: 123+4-5+67-89=100. Число 123 вышло из склеивания соседних цифр 1, 2 и 3. Также 67 и 89. Признаю, тема подымалась уже не раз, но не на языке С(по крайней мере не нашёл, извините). Хотя бы здесь - Заданы цифры - расставить знаки сложения и вычитания так, чтобы получилось выражение с заданным результатом Но вот в чем проблема. Мы на парах пока только начали изучать С, конкретно дошли до циклов на данный момент. Все предлагаемые решения используют функции, структуры и тд. и тп. Вопрос: Возможно ли реализовать указанную программу с помощью циклов (задача по теме Циклы) и условных операторов? Если да, то намекните пожалуйста как это реализовать.

Решение задачи: «Заданы цифры - расставить знаки сложения и вычитания так, чтобы получилось выражение с заданным результатом»

textual
Листинг программы
#include <stdio.h>
#include <stdbool.h>
#include <ctype.h>
#include <stdlib.h>
#include "myOwn.h"
 
#define TARGET 100
 
int solve_expression(char *expr, bool flag);
void tern_num(int n, int * map);
 
int main(int argc, char const *argv[]) {
  char templ[] = "123456789", expression[18];
  int map[8];
 
  for (size_t i = 0; i <= 6561; i++) {
 
    //обнуляем нашу карту операций
    for (size_t y = 0; y < 8; y++) {
      map[y] = 0;
    }
 
    // заполняем карту операций
    tern_num(i, map);
 
    // формируем наше выражение с помощью шаблона и карты операций
    for (size_t i = 0, exp_i = 0, map_i = 0; i < 18; i++) {
      if (i == 17) {
        expression[i] = '\0';
        break;
      }
      if (i == 0 || !(i % 2)) {
        expression[i] = templ[exp_i];
        exp_i++;
      } else {
        switch (map[map_i]) {
          case 0:
            expression[i] = ' '; map_i++; break;
          case 1:
            expression[i] = '+'; map_i++; break;
          case 2:
            expression[i] = '-'; map_i++; break;
        }
      }
    }
    if (solve_expression(expression, false) == TARGET) {
      // printf("%s\n", expression);
      solve_expression(expression, true);
    }
  }
 
 
  printf("Closing!\n");
  return 0;
}
 
int solve_expression(char *expr, bool flag){
 
  int res = 0, buffer = 0, i = 0;
  while (isdigit(expr[i]) || expr[i] == ' ') {
    if (expr[i] == ' ') {
      i++;
      continue;
    }
    res = res * 10 + ((int)expr[i] - '0');
    i++;
  }
  if (flag) {
    printf("%d", res);
  }
  for (; i < 18;) {
    if (expr[i] == '+') {
      buffer = 0;
      i++;
      while (isdigit(expr[i]) || expr[i] == ' ') {
        if (expr[i] == ' ') {
          i++;
          continue;
        }
        buffer = buffer * 10 + ((int)expr[i] - '0');
        i++;
      }
      if (flag) {
        printf("+%d", buffer);
      }
      res += buffer;
    } else if (expr[i] == '-') {
      buffer = 0;
      i++;
      while (isdigit(expr[i]) || expr[i] == ' ') {
        if (expr[i] == ' ') {
          i++;
          continue;
        }
        buffer = buffer * 10 + ((int)expr[i] - '0');
        i++;
      }
      if (flag) {
        printf("-%d", buffer);
      }
      res -= buffer;
    } else {
      i++;
    }
  }
  if (flag) {
    printf("=%d\n", res);
  }
  return res;
 
}
 
void tern_num(int n, int * map){
  int i = 7;
  while (n > 0) {
    map[i] = n % 3;
    n /= 3;
    i--;
  }
}

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


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

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

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