首页 > 解决方案 > 毕达哥拉斯三重嵌套循环的误解

问题描述

问候和问候;

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

这是什么原因?

标签: c++algorithmmathcomputer-science

解决方案


对于 a < b :

毕达哥拉斯三元组成对出现,即 (a,b,c) 和 (b,a,c):a,b < c ∀ a,b,c ∈ ℕ。因为如果找到一个,则一对中的另一个将成为微不足道的解决方案。假设找到一个毕达哥拉斯三元组 (a,b,c) 使得 a < b 然后我们立即知道 (b,a,c) 也是一个毕达哥拉斯三元组,所以我们不希望我们的程序像它那样搜索它只是增加搜索域,从而增加执行时间。为了避免这种情况,循环设置为 a≤b。但是,您也可以将它们初始化为 a < b 或 b = a + 1

对于 b < c 或 a < b < c:

您可以将它们初始化为 a < b < c 或 (c = b + 1 and 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 < b < c


推荐阅读