当前位置: 首页 > 知识库问答 >
问题:

所有可能的毕达哥拉斯三元组

佟和平
2023-03-14

问题来了

找出所有毕达哥拉斯三元组中的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;
                 }


            }
        }
    }
}

共有2个答案

景辰钊
2023-03-14

除了亚当·罗森菲尔德指出的问题。如果限制再高一点,程序在这样的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
        }
    }
}
曹华荣
2023-03-14

这不是一个无限循环,这只是一个非常慢的有限循环。输入/输出很慢——你在中间循环的cout语句中打印出500*500 = 250,000行文本,向控制台打印出250,000行文本非常非常慢。如果你删除那个打印语句,它会执行得更快。

其次,您的逻辑中有一个错误。变量side 1side 2rightSide从来没有在适当的时候重置为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 讲一下阿里