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个条件,这是很多和愚蠢的。有没有办法以更智能的方式解决这个问题?
顺便说一下,我是初学者,所以如果您有任何先进的方法,请简要解释一下。
答案 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起可用),它允许您以简单的方式迭代任何容器。