找到独特的毕达哥拉斯三重奏

时间:2013-02-13 21:30:10

标签: c++ c

我试图从一系列毕达哥拉斯三元组中排除重复的三角形,这些三角形只打印具有100的斜体的三角形,但我在排除部分中做的事情失败了......我有以下内容:

....
    int one_hundred = 0,
     if( (a*a) + (b*b) == (h*h) ){

        //exclusion
        if((a == b)){

           continue;

        }else {

       //Just prints the the triangles that have hypotenuses of 100
      if(h == 100){
            cout <<  a << "     " << b << "     " << h << endl;

           }

      .....

     }

现在输出应为

重复的意思是第一行和最后一行具有相同的一对边

我想要的是这样的输出:

enter image description here

但我这样做如下:

//看看它们是否重复

if((a == 96)){

    continue;

    }

我认为通过比较a == b我会达到相同但我没有:

if((a == b)){

    continue;

    }

希望这能澄清我想要做的事情......

再次感谢你!!

3 个答案:

答案 0 :(得分:3)

从一系列毕达哥拉斯三元组中过滤掉重复数据非常困难,因为你需要永久记住所有旧的三元组,进行大量的比较。

更好的方法是不要开始重复。为此,您可以使用这组公式(来自the "Generating a triple" section of the Wikipedia article on Pythagorean triples):

  

a = k ·( m 2 - n 2
   b = k ·(2
   c = k ·( m 2 + n 2

其中 k m n 是正整数, m n < / em>是coprime(意思是他们最大的共同点是1), m n 是偶数。

答案 1 :(得分:0)

如果(if(abs(a-b)&lt; EPSILON))继续......

此外,在第一个if结构中使用相同的不等式(在某处定义EPSILON)。

自从我进行C编码以来已经有一段时间了,但是双重或浮点数的相等用于得到错误的结果。除非它们都是整数,在这种情况下(a == b)与(b == a)相同,不确定为什么两者都有。

答案 2 :(得分:0)

我认为一个简单的方法是创建std::vector<bool> state(h);因为h是所有方面中最大的,其他方面永远不会更大;对?而且我们知道没有其他数字乘以它自己可以等于另一个乘以它自己,否则你可以说像 5 * 5 = 4 * 4 !因此,您可以使用向量下标作为数字的代表。当您拉出一个数字并发现它是您问题的解决方案时,只需将其状态切换为false即可。整件事情会像这样 -

bool loop;
std::vector<bool> *state = new std::vector<bool>(h, true);
for(int i = 2; i != sizeof(bool) * h; ++i)
{
    if((state + i))
    {
        a = i;
        loop = true;

        for(int j = i + 1; loop && j != sizeof(bool) * h; ++j)
        {
            if((state + j))
            {
                b = j;          

                if((a*a) + (b*b) == (h*h))
                {
                    loop = false;
                    (*state)[i] = false;                                                      
                    (*state)[j] = false;
                    std::cout << a << " " << b << " " << h << std::endl;
                }
            }
        }
    }
}

我的输出是:

28 96 100
60 80 100

我认为您想要的结果示例中的含义是什么。否则,您需要创建一个双打印某些规则的规则。在这种情况下,您可以添加switch(){}。不是那么难,认为它不是那么优雅,非常。

注意: 实际上没有必要将state->at(i)更改为falsei会增加,并且永远不会再次触及。但是如果您以后需要使用潜艇的话就在那里。索引0和1已被忽略,因为三角形的任何一边都不能为0,如果一个是可行的,另一边必须等于h,所以不要浪费宝贵的时间。如果您确实坚持他们,请记住0和1是true开头,应该设置为false。