我目前正在研究一种算法,使用数字1-9来查找所有带有9位数字的数字,而没有任何重复。我正在测试一个我认为过滤数字的理论,因为这样可以创建一个更有效的数独检查器。C++中的数独检查器算法
我实现的代码执行以下操作。 (a)(b)(c)(d)(e)(f)(g)(h)(i)= ###### ###。
我的理论是,通过检查数字(a-i)的和是否等于45,a到i的乘积等于9!并且ai的逆和的总和等于大约2.828968(或1 + 1/2 + 1/3 ... 1/9)
问题是我过滤了9位数字ai的逆数的总和,可能的9位数字预测的数量小于9! (可能的实际数量)。我不确定它为什么会过滤这么多,但它所捕捉的数字没有任何重复(这很好)。
我的想法是,我玩双打的方式搞乱了算法。
这里是我的代码:
#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;
}
我一生都没有见过这么多嵌套的循环! –
你的问题是什么?和@PaulManta是对的,代码是可怕的:D – dreamzor
哈哈是啊我知道这是可怕的,我正在测试我有一个理论。这段代码实际上并不会实现到我的数独检查器中。 我的问题是为什么在过滤9位数字而不是9位数字后,它只给出112112个结果! (362880)9位数字的理论可能性,无重复。 – user1658865