我目前正在研究一种算法,以使用数字 1-9 查找所有 9 位数字而没有任何重复。我正在测试一个理论,我认为这样的过滤数字将使数独检查器更有效。
我实现的代码执行以下操作。它对数字中的 1-9 位置使用 for 循环,例如 (a)(b)(c)(d)(e)(f)(g)(h)(i) = ###### ###。
我的理论是,通过检查数字 (ai) 的总和是否等于 45,a 到 i 的乘积等于 9!并且 ai 的倒数之和大约等于 2.828968(或 1 + 1/2 + 1/3 ... 1/9)
问题是,在我通过 ai 的倒数之和过滤 9 位数字后,预测的可能 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;
}