我目前正在研究一种算法,使用数字 1-9 不重复地查找所有 9 位数字。我正在测试我的理论,即这样过滤数字将有助于提高数独检查器的效率。
我实现的代码执行以下操作。它对数字中的第 1-9 位使用 for 循环,例如 (a)(b)(c)(d)(e)(f)(g)(h)(i) = ###### ###。
我的理论是,通过检查数字 (a-i) 的总和是否等于 45,a 到 i 的乘积等于 9!并且 a-i 的倒数之和大约等于 2.828968(或 1 + 1/2 + 1/3 ... 1/9)
问题是我用a-i的倒数之和过滤9位数字后,预测的9位可能数字的个数小于9! (可能数字的实际数量)。我不确定为什么要过滤这么多,但它捕获的数字没有任何重复(这很好)。
我的想法是我玩 double 的方式搞乱了算法。
这是我的代码:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int product;
int sum;
int count=0;
double inverseSum;
double correctInverseSum=(1.0/1.0)+(1.0/2.0)+(1.0/3.0)+(1.0/4.0)+(1.0/5.0)+
(1.0/6.0)+(1.0/7.0)+(1.0/8.0)+(1.0/9.0);
for(double a=1.0; a<10.0; a++){
for(double b=1.0; b<10.0; b++){
for(double c=1.0; c<10.0; c++){
for(double d=1.0; d<10.0; d++){
for(double e=1.0; e<10.0; e++){
for(double f=1.0; f<10.0; f++){
for(double g=1.0; g<10.0; g++){
for(double h=1.0; h<10.0; h++){
for(double i=1.0; i<10.0; i++){
product=a*b*c*d*e*f*g*h*i;
sum=a+b+c+d+e+f+g+h+i;
if(product==9*8*7*6*5*4*3*2*1 && sum==45){
inverseSum=(1.0/a)+(1.0/b)+(1.0/c)+(1.0/d)+
(1.0/e)+(1.0/f)+(1.0/g)+(1.0/h)+(1.0/i);
if(inverseSum==correctInverseSum)
{
count++;
}
}
}
}
}
}
}
}
}
}
}
cout<<"This is the count:"<<count<<endl;
return 0;
}
最佳答案
既然我在看到这么多 for 循环后洗了眼睛,我会说一个候选者是:
if(inverseSum==correctInverseSum)
double
s 不能完全表示,因此您必须使用小 epsilon 检查是否相等。像这样的东西:
if (fabs(inverseSum - correctInverseSum) < std::numeric_limits<double>::epsilon())
您需要 #include <limits>
.
关于c++ - C++中的数独棋子算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12556137/