在if语句条件中检查组变量是否彼此相等

时间:2016-08-18 06:34:12

标签: c++ variables if-statement

DJANGO_SETTINGS_MODULE

所以我有这个代码可以找到1到9之间的所有可能组合,看看哪个会解决方程式,你可以看到我有9个变量。

这个等式可以用许多不同的组合来解决,但我的目标是使变量彼此不相等。当然,我可以通过在#include <iostream> using namespace std; int main () { cout << "starting program" << endl; for (int a=1; a<10; a++) { for (int b=1; b<10; b++) { for (int c=1; c<10; c++) { for (int d=1; d<10; d++) { for (int e=1; e<10; e++) { for (int f=1; f<10; f++) { for (int g=1; g<10; g++) { for (int h=1; h<10; h++) { for (int i=1; i<10; i++) if (a+(13 * b / c) +d +(12 * e )- f - 11 + (g * h / i) - 10 == 66) { cout << a << b << c << d << e << f << g << h << i << endl ; } } } } } } } } } return 0; } 语句条件中编写每个条件来解决这个问题,但这将是81个条件,这是很多和愚蠢的。有没有办法以更智能的方式解决这个问题?

顺便说一下,我是初学者,所以如果您有任何先进的方法,请简要解释一下。

1 个答案:

答案 0 :(得分:2)

如@n.m所述。在注释中,由于所有变量必须不同,因此您正在寻找范围1到9的排列 1 。这很好,因为c ++已经为您提供了将生成排列的std::next_permutation为你:

// Array for your variables, vars[0] is a, vars[1] is b, and so on...
std::array<int, 9> vars;

// Fill the array from number from 1 to 9 (so a = 1, b = 2, and so on... )
std::iota(std::begin(vars), std::end(vars), 1);

// Loop through all permutations of this array (see std::next_permutation):
//   1 2 3 4 5 6 7 8 9
//   1 2 3 4 5 6 7 9 8
//   1 2 3 4 5 6 8 7 9
//   ...
//   9 8 7 6 5 4 3 2 1
do {
    // Check if the variables matches what you want (see below for check):
    if (check(vars)) {
        std::cout << "Solution found: ";
        for (auto v: vars) 
            std::cout << v << ' ';
        std::cout << '\n';
    }
} while(std::next_permutation(std::begin(vars), std::end(vars)));

check的位置,例如 2

int check(std::array<int, 9> const& vars) {
    // Remember that vars[0] is a, vars[1] is b, ..., I rewrote your comparison as:
    //   c * i * (a + d + 12 * e - f - 11 -10) + 13 * b * i + c * g * h == 66 * c * i
    // ...in order to avoid division.
    return vars[2] * vars[8] * (vars[0] + vars[3] + 12 * vars[4] - vars[5] - 11 - 10)
        + (13 * vars[1] * vars[8])
        + (vars[2] * vars[6] * vars[7]) == 66 * vars[2] * vars[8];
}

1 还有其他方法可以找到您的解决方案:您可以使用已经受影响的变量的值减少要分配的下一个变量的域(例如,有不需要循环最后一个变量,因为最后只有零或一个值),但这更复杂,可能对你想做的事情有些过分。如果您想了解更多相关信息,可以查找constraint programming

2 我重新组织计算,因为你正在进行整数除法,这会截断结果,因此你可能得到错误的解决方案。

有关作为初学者可能不熟悉的代码的一些细节:

  • std::array<int, 9>(c ++ 11)是一个替换int vars[9]的静态数组,你应该更喜欢在c风格的数组中使用它。
  • std::iota<algorithm>标题中的一个函数,它会将范围std::begin(vars)填充到std::end(vars),其值从1开始增加(提供的值为最后一个论点)。
  • for (auto x: vars)range-based for loop(自c ++ 11起可用),它允许您以简单的方式迭代任何容器。