如何处理“所有组合”项目是最佳方式?(这是一个关于IT技术的提问标题)

4

我被分配了一个学校项目,需要使用整数2 3 4和运算符+ - * / %来尽可能多地生成整数。然后,我需要使用cout输出这些整数以及生成它们的方式。例如:

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

我每个cout语句只能使用一次整数,并且不能有重复的答案。
其他人似乎都在使用"暴力"方法(即复制和粘贴相同的语句并更改数字和运算符),但这似乎不太有效。我想尝试逐个循环每个数字和运算符,检查答案是否已经找到,但我不确定最简单的方法是什么。
我想我可以使用嵌套循环,但仍然存在检查答案是否已经找到的问题。我尝试将答案存储在向量中,但我无法将向量传递给用户定义的函数来检查向量中是否存在一个值。
3个回答

2

您可以使用标准模板库(STL)中的maphash_map。这些结构能够高效地存储键值对。在使用它们之前请先了解一下,但它们可能会为您提供一个很好的起点。提示:您计算出来的整数可能会成为很好的键。


0
你可以尝试一些元编程,如下所示。它的优点是使用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

我并不完全确定将其作为任务提交的智慧性 :-)


你在这里错过了6个表达式,然后你必须交换(2,3,4)的位置。 - JoshMachine
@Josh,请告诉我缺少哪些。 我确实注意到一个问题,但我已经修复了它,但输出仍然相同。 请记住,我读到“不能有重复的答案”,这意味着如果两个表达式等于相同的值(例如s+3+44+3+2),您只会打印一个。 因此,如果这是差异的原因,我们将把它归结为解释问题。 - paxdiablo

0
假设您只能使用集合中的每个数字(2、3、4)一次,那么有3!种排列这3个数字的方式。然后有2个符号位置,您总共有5个符号(+ - * / %),因此有25种方法可以完成。因此,您总共有3!* 25个表达式。 然后,您可以创建一个哈希映射,其中键将是数字,值将是表达式。如果哈希映射已经包含一个键,则跳过该表达式。

@ Josh,使用你的方法我们没有考虑到像 23*4 这样的情况。 - anijhaw
@anijhaw 我认为只允许使用单个数字。在这种情况下,我需要澄清以下问题:i)是否允许使用没有符号的数字ii)是否允许重复数字iii)如果允许重复数字,则最长序列的长度是多少这将使项目变得非常庞大:D - JoshMachine
只允许输入个位数数字。 - Maxpm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接