问候和问候;
我试图找到小于1000的毕达哥拉斯三重数。
幸运的是,我能够找到它的算法,这里是:
for (int a = 1; a < 1000; a++)
{
for (int b = a; b < 1000; b++)
{
for (int c = b; c < 1000; c++)
{
if ((a * a) + (b * b) == (c * c))
{
cout << "( " << a << ", " << b << ", " << c << " )";
cout << endl;
}
}
}
}
但是我对这段代码一无所知! 为什么每个循环的初始值从前一个循环的值开始?而每个循环的初始值可以从1开始
!这是什么原因呢?
对于 a
毕达哥拉斯三元组成对出现,即(a,b,c(和(b,a,c(:a,b<c∀a,b,c∈N。因为如果找到一个,这对中的另一个就变成了微不足道的解决方案。假设找到一个毕达哥拉斯三元组><b,那么我们立即知道><启动>启动>
对于 b或 a<c:>
您可以将它们启动为 b毕达哥拉斯三胞胎只有一种排序方式:如果a² + b² = c²
那么可以证明比a² + c² ≠ b²
和b² + c² ≠ a²
。
从上述和一些特殊情况(a = 0
被定义排除在外,a ∊ (0, 2]
很容易手动检查(,因此只需要检查2 < a ≤ b < c
的三元组,这就是树循环(几乎(所做的。
这有两个原因:
-
通过设置循环,以便
a ≤ b ≤ c
我们保证没有三元组出现超过一次 -
要测试的三元组较少,因此我们将执行时间减少了一个常数因子。