毕达哥拉斯三重嵌套循环误解



问候和问候;

我试图找到小于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

和 b = a + 1( <,因为没有毕达哥拉斯三元组的形式可以是 (b,b,c( 为 b^2 + b^2 = 2 * b^2 = c^2,这意味着 c = b * sqrt(2(,其中 c 是整数,b * sqrt(2( 是无理数, 所以两者永远不可能相等,整数解也永远不可能存在。但是 c = b * sqrt(2( 也说 c> b。

因此,a

毕达哥拉斯三胞胎只有一种排序方式:如果a² + b² = c²那么可以证明比a² + c² ≠ b²b² + c² ≠ a²

从上述和一些特殊情况(a = 0被定义排除在外,a ∊ (0, 2]很容易手动检查(,因此只需要检查2 < a ≤ b < c的三元组,这就是树循环(几乎(所做的。

这有两个原因:

  1. 通过设置循环,以便a ≤ b ≤ c我们保证没有三元组出现超过一次

  2. 要测试的三元组较少,因此我们将执行时间减少了一个常数因子。

最新更新