Какой лучший способ справиться с проектом «все комбинации»? - PullRequest
4 голосов
/ 11 ноября 2010

Мне был назначен школьный проект, в котором мне нужно составить как можно больше целых чисел, используя только целые числа 2 3 4 и операторы + - * / %. Затем я должен вывести целые числа с cout вместе с тем, как я получил этот ответ. Например:

cout << "2 + 3 - 4 = " << 2 + 3 - 4;

Я могу использовать каждое целое число только один раз для cout оператора, и не может быть повторяющихся ответов.

Кажется, что все остальные используют метод "грубой силы" (то есть копируют и вставляют одни и те же операторы и меняют числа и операторы), но это вряд ли кажется эффективным. Я подумал, что попробую поочередно просмотреть каждый номер и оператор и проверить, найден ли ответ, но я не уверен, какой самый простой способ сделать это будет.

Полагаю, я мог бы использовать вложенные циклы, но по-прежнему существует проблема проверки того, найден ли ответ. Я попытался сохранить ответы в векторе, но не смог передать вектор в пользовательскую функцию, которая проверяла, существует ли значение в векторе.

Ответы [ 3 ]

2 голосов
/ 11 ноября 2010

Вы можете использовать map или hash_map из Стандартной библиотеки шаблонов (STL).Эти структуры эффективно хранят пары ключ-значение.Читайте о них, прежде чем использовать их, но они могут дать вам хорошую отправную точку.Подсказка: целые числа, которые вы вычисляете, вероятно, составят хорошие ключи.

0 голосов
/ 11 ноября 2010

Вы можете попробовать немного метапрограммирования следующим образом. Он имеет преимущество в использовании самого C для вычисления выражений, а не в том, что вы пытаетесь создать собственный оценщик (и, возможно, ошибаетесь):

#include <stdlib.h>
#include <iostream>
#include <fstream>
using namespace std;

int main (void) {
  int n1, n2, n3;
  const char *ops[] = {" + ", " - ", " * ", " / ", " % ", 0};
  const char **op1, **op2;
  ofstream of;

  of.open ("prog2.cpp", ios::out);

  of << "#include <iostream>\n";
  of << "using namespace std;\n";
  of << "#define IXCOUNT 49\n\n";
  of << "static int mkIdx (int tot) {\n";
  of << "  int ix = (IXCOUNT / 2) + tot;\n";
  of << "  if ((ix >= 0) && (ix < IXCOUNT)) return ix;\n";
  of << "  cout << \"Need more index space, "
     << "try \" << IXCOUNT + 1 + (ix - IXCOUNT) * 2 << \"\\n\";\n";
  of << "  return -1;\n";
  of << "}\n\n";
  of << "int main (void) {\n";
  of << "  int tot, ix, used[IXCOUNT];\n\n";
  of << "  for (ix = 0; ix < sizeof(used)/sizeof(*used); ix++)\n";
  of << "    used[ix] = 0;\n\n";

  for (n1 = 2; n1 <= 4; n1++) {
    for (n2 = 2; n2 <= 4; n2++) {
      if (n2 != n1) {
        for (n3 = 2; n3 <= 4; n3++) {
          if ((n3 != n1) && (n3 != n2)) {
            for (op1 = ops; *op1 != 0; op1++) {
              for (op2 = ops; *op2 != 0; op2++) {
                of << "    tot = " << n1 << *op1 << n2 << *op2 << n3 << ";\n";
                of << "    if ((ix = mkIdx (tot)) < 0) return ix;\n";
                of << "    if (!used[ix])\n";
                of << "      cout << " << n1 << " << \"" << *op1 << "\" << "
                   << n2 << " << \"" << *op2 << "\" << " << n3
                   << " << \" = \" << tot << \"\\n\";\n";
                of << "    used[ix] = 1;\n\n";
              }
            }
          }
        }
      }
    }
  }

  of << "    return 0;\n";
  of << "}\n";

  of.close();

  system ("g++ -o prog2 prog2.cpp ; ./prog2");
  return 0;
}

Это дает вам:

2 + 3 + 4 = 9
2 + 3 - 4 = 1
2 + 3 * 4 = 14
2 + 3 / 4 = 2
2 + 3 % 4 = 5
2 - 3 + 4 = 3
2 - 3 - 4 = -5
2 - 3 * 4 = -10
2 - 3 % 4 = -1
2 * 3 + 4 = 10
2 * 3 * 4 = 24
2 / 3 + 4 = 4
2 / 3 - 4 = -4
2 / 3 * 4 = 0
2 % 3 + 4 = 6
2 % 3 - 4 = -2
2 % 3 * 4 = 8
2 * 4 + 3 = 11
2 / 4 - 3 = -3

Я не полностью уверен в мудрости передачи этого в качестве задания, однако: -)

0 голосов
/ 11 ноября 2010

Предполагая, что вы можете использовать каждое из чисел в наборе (2, 3, 4), только когда их 3!способы размещения этих 3 номеров.Тогда есть 2 места для знака, и у вас есть всего 5 символов (+ - * /%), поэтому есть 5 * 5 = 25 способов сделать это.Итак, у вас всего 3!* 25 выражений.Затем вы можете создать хеш-карту, где ключом будет число, а значением будет выражение.Если в хэш-карте уже есть ключ, пропустите это выражение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...