处理“所有组合”项目的最佳方式是什么?

问题描述:

我已经分配了一个学校项目,在这个项目中,我只需要使用整数2 3 4和运算符+ - */%来尽可能多的整数。然后我必须输出与cout一起的整数以及我如何得到答案。例如:处理“所有组合”项目的最佳方式是什么?

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

我只能用每个整数每一次发言cout,并且可以有没有重复的答案。其他人似乎都在采用“蛮力”方法(即复制和粘贴相同的语句并更改数字和操作符),但这似乎不大有效。我想我会尝试一个一个循环地查看每个数字和运算符,并检查是否已经找到答案,但我不确定最简单的方法是什么。

我想我可以使用嵌套循环,但仍然有检查是否已经找到答案的问题。我尝试将答案存储在向量中,但是我无法将该向量传递给用户定义的函数,该函数检查向量中是否存在值。

您可以使用标准模板库(STL)中的maphash_map。这些结构可以有效地存储键值对。在使用它们之前阅读它们,但它们可能会给你一个很好的起点。提示:你计算的整数可能会成为好钥匙。

+0

谢谢,我会研究一下。 – Maxpm 2010-11-11 03:09:49

假设您可以使用集合(2,3,4)中的每个数字,只有一次有3!安排这3个数字的方法。然后有2个位置用于标志,并且您总共有5个符号(+ - * /%),所以有5 * 5 = 25个方法可以做到这一点。所以你总共有3个! * 25表达式。 比你可以创建一个哈希图,其中键将数字和值将是表达式。如果散列图已经包含一个键,则可以跳过该表达式。

+0

@ Josh我们没有考虑像23 * 4这样的案例。 – anijhaw 2010-11-11 03:14:11

+0

@anijhaw我认为只有一位数字是允许的。在这种情况下我需要澄清 i)如数的w/o符号允许 ⅱ)数的重复被允许 ⅲ)如果重复被允许的序列的最大长度 这使得项目非常大:d – JoshMachine 2010-11-11 03:21:17

+0

只允许一位数字。 – Maxpm 2010-11-11 04:37:55

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

你错过了6个表达式,然后你必须交换(2,3,4) – JoshMachine 2010-11-18 20:25:47

+0

@Josh的职位,随时告诉我_哪些人失踪。我确实发现了一个我固定的问题,但输出仍然相同。请记住,我读了“不可重复的答案”,意思是说,如果两个表达式等于相同的值(例如's + 3 + 4'和'4 + 3 + 2'),则您只打印一。所以,如果这是造成这种差异的原因,我们就把它归结为解释问题。 – paxdiablo 2010-11-18 23:58:58