问题来了
找出所有毕达哥拉斯三元组中的1边、2边和斜边都不超过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语言的新手,我是自学的。而且,这不是家庭作业,我做问题陈述是因为这是表达问题的最佳方式。
编辑
右侧1侧2
运行成功(总时间: 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;
}
}
}
}
}
除了亚当·罗森菲尔德指出的问题。如果限制再高一点,程序在这样的3个循环中不会很快完成。
第一个观察是,你不需要第三个内循环,因为斜边可以计算和比较。从2边计算斜边,使其成为整数,并检查毕达哥拉斯等式是否仍然有效。
你可以做更多的观察:这两条边是可以互换的,所以我们只需要循环到sqrt(5002/2)(进行检查只会反转边)。对于直角三角形另一侧的第二个内循环,由于我们知道上限,我们可以通过循环到sqrt(5002-side12)来减少循环的数量。
伪代码,而不是C代码(C代码中的^
是XOR,但我在下面的伪代码中使用^
来表示功率)。轮()
将舍入到最近的整数(您可能需要实现这一点)。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
}
}
}
这不是一个无限循环,这只是一个非常慢的有限循环。输入/输出很慢——你在中间循环的cout
语句中打印出500*500 = 250,000行文本,向控制台打印出250,000行文本非常非常慢。如果你删除那个打印语句,它会执行得更快。
其次,您的逻辑中有一个错误。变量side 1
、side 2
和rightSide
从来没有在适当的时候重置为0,所以它们只是不断增加超过预期的值。尝试将它们重置为0,或者只是使用循环计数器而不是像这样的额外变量。
本文向大家介绍p5.js 毕达哥拉斯树的实现代码,包括了p5.js 毕达哥拉斯树的实现代码的使用技巧和注意事项,需要的朋友参考一下 本文介绍了p5.js 毕达哥拉斯树的实现代码,分享给大家,具体如下: 效果如下: 主要方法 translate() rotate() rect() push() pop() map() 主要思想 递归 草图 过程分解 一、毕达哥拉斯树的递归函数 二、声明变量、创建画布
null 我用我在这里找到的公式来生成三元组,从而生成周长。我更喜欢用附加系数“k”的公式,因为文章说, 尽管产生了所有的原语三元组,欧几里德公式并不产生所有的三元组--例如,(9,12,15)不能使用整数m和n产生。这可以通过在公式中插入一个额外的参数k来弥补。 为了在合理的时间内解决这个问题,我需要对嵌套循环中的参数进行合理的限制。我设置了“k”和“m”的限制,您将在后面的完整代码中看到,这两
作为一个类任务,我将编写一个C程序来生成所有低于给定值not'的毕达哥拉斯三元组。下面是我的代码,它首先使用欧几里德公式生成一个原语三元组(a,b,c),并打印形式为1 我遇到的大多数其他算法使用嵌套循环来检查平方和,并且随着t的增长,速度明显慢于此。有可能推导出一个证明它确实更快的证据吗?
我有一个包含加密符号列表的数组,例如(因为有一千多个) 我需要创建一个多维数组,包含所有可能的组合,例如。 生成的数组不应该有重复的排列,如, 我真的不知道从哪里开始。我能得到的最接近的方法是用一些对构建一个数组(然后,不是写出来的,目标是逐渐搜索并添加缺少的组合): 任何帮助都将不胜感激。我的项目的其余部分是用Python 3.8编写的。
#24届软开秋招面试经验大赏# 认准拉普拉斯,秋招必上岸 就业zixun可私。 面的是提前批,面试官看起来挺凶,其实还可以。 不过这一面其实问了我很多刁钻的问题,不过都没有抓着不放,回答一下就放过我了。感恩。 不知道字节商业化卷不卷。 面了一小时,难度4.5颗星。 1 自我介绍 2 实习介绍 项目介绍 科研介绍 3 介绍延迟转换问题,怎么解决 4 介绍怎么做的反事实 5 让我给我的论文里的结论做个
#24届软开秋招面试经验大赏# 认准拉普拉斯,秋招必上岸 就业咨xun可私。 嗯,来到了第三个车轮战。这个时候我的嗓子已经干了,喝了两口水就继续了。搞笑的是面试官也感觉有气无力。于是我俩就都开始懒惰的聊。。 这个时候我已经有点开始迷糊了。想到一会还要面字节。。。 面了五十分钟,难度四颗星。一颗星给车轮战。 1 自我介绍 2 实习介绍 项目介绍 科研介绍 3 coding 对称二叉树 4 讲一下阿里