c++ - 毕达哥拉斯三重嵌套循环的误解
问题描述
问候和问候;
我试图找到小于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 < 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
推荐阅读
- arrays - 从 Monogodb 返回的数据顺序
- android - 如何从方法内部的响应中获取结果?
- qt - 如何从 Qt QML Map 访问 WMS 或 WMTS
- python-3.x - 为什么这个多项式函数会给出截然不同的结果,具体取决于我绘制的点数?
- azure-log-analytics - 是否可以在 Azure Sentinel 中创建日志源健康警报?
- reactjs - 为什么没有添加 Set-Cookie 标头?
- sql - 每家餐厅的独特客户
- python - 遍历两个数据帧并创建一个字典,一个数据帧是在第二个数据帧(值)中找到的字符串中的子字符串
- stackdriver - 将自定义 jmx 指标添加到谷歌云监控 collectd 配置
- groovy - Groovy replaceAll 替换多个半匹配字符串