这是问题
查找side1,side2和斜边的所有毕达哥拉斯三元组都不超过500.使用三重嵌套for循环尝试可能性。
以下是我的尝试
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int side1 = 0;
int side2 = 0;
int rightSide = 0;
cout << "Right Side" << setw(10) << "Side1" << setw(10) << "Side2" << endl;
for(int i=1;i<=500;i++)
{
side1++;
//cout << side1 << endl;
for(int a=1;a<=500;a++)
{
side2++;
//cout << "side 2 " << side2 << endl;
for(int c=1;c<=500;c++)
{
rightSide++;
int rightSideSqr = rightSide*rightSide;
int side1Sqr = side1*side1;
int side2Sqr = side2*side2;
if(rightSideSqr == side1Sqr+side2Sqr)
{
cout << rightSideSqr << setw(15) << side1 << setw(10) << side2 << endl;
}
}
}
}
}
但它没有成功,似乎是一个无限循环。请帮忙。
请注意:我是C ++的新手,我自己研究。而且,这不是作业,我提出了问题陈述,因为这是表达问题的最佳方式。
修改
右侧Side1 Side2
RUN SUCCESSFUL(总时间:1s)
编辑2
工作代码
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
//int side1 = 0;
//int side2 = 0;
//int rightSide = 0;
cout << "Right Side" << setw(10) << "Side1" << setw(10) << "Side2" << endl;
for(int i=1;i<=500;i++)
{
//side1++;
//cout << side1 << endl;
for(int a=1;a<=500;a++)
{
//side2++;
//cout << "side 2 " << side2 << endl;
for(int c=1;c<=500;c++)
{
//rightSide++;
int rightSideSqr = c*c;
int side1Sqr = i*i;
int side2Sqr = a*a;
if(rightSideSqr == (side1Sqr+side2Sqr))
{
cout << rightSideSqr << setw(15) << i << setw(10) << a << endl;
}
}
}
}
}
答案 0 :(得分:3)
它不是一个无限循环,它只是一个非常缓慢的有限循环。 I / O很慢 - 您在中间循环的cout
语句中打印出500 * 500 = 250,000行文本,并且向控制台打印出250,000行文本非常非常慢。如果删除该print语句,它将更快地执行。
其次,你的逻辑有误。变量side1
,side2
和rightSide
永远不会在适当的时间重置为0,因此它们只会继续超出预期值。尝试将它们重置为0,或者只使用循环计数器而不是像这样的额外变量。
答案 1 :(得分:1)
除了@Adam Rosenfield指出的问题。如果限制提高一点,程序将无法快速完成3个循环。
首先观察到你不需要第3个内环,因为可以计算和比较斜边。计算两边的斜边,使其成为整数,并检查毕达哥拉斯式的平等是否仍然存在。
你可以做一些更多的观察:两边是可以互换的,所以我们只需要循环到sqrt(500 2 / 2)(过去只会反转两边)。对于右三角形另一侧的第二个内环,由于我们知道了上限,我们可以通过循环到sqrt来减少循环次数(500 2 - side1 2功能)。
伪代码,不是C代码(C代码中的^
是异或,但我在下面的伪代码中使用^
表示功率)。 round()
将舍入到最接近的整数(您可能需要实现此操作)。在进入循环之前,可以缓存2个循环的上限,因为它们的值在循环期间不会改变:
for (side1 = 1; side1 <= round(sqrt(500^2 / 2)); side1++) {
for (side2 = side1; side2 <= round(sqrt(500^2 - i^2)); side2++) {
hypo = round(sqrt(side1^2 + side2^2))
if (hypo^2 == side1^2 + side2^2) {
printResult
}
}
}