0

我试图从勾股三元组序列中排除重复三角形,这些三元组只打印斜边为 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;

           }

      .....

     }

现在这个输出应该是

我所说的重复是指第一行和最后一行具有相同的一对边

我想要的是这样的输出:

在此处输入图像描述

但是我这样做如下:

//查看是否重复

if((a == 96)){

    continue;

    }

而且我认为通过比较 a == b 我会达到相同的效果,但我没有:

if((a == b)){

    continue;

    }

希望这能澄清我正在尝试做的事情......

再次感谢你!!

4

3 回答 3

3

从毕达哥拉斯三元组序列中过滤掉重复项非常困难,因为您需要永久记住所有旧三元组,以便进行大量比较。

更好的方法是一开始就不产生重复。为此,您可以使用这组公式(来自关于毕达哥拉斯三元组的维基百科文章的“生成三元组”部分):

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

其中kmn是正整数,其中mn互质(意味着它们的最大公分母是 1)并且mn是偶数。

于 2013-02-13T21:39:30.843 回答
0

怎么样 (如果 (abs (ab) < EPSILON)) 继续...

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

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

于 2013-02-13T21:37:21.553 回答
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(){}. 没那么难,当然它不是那么优雅,imoo。

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

于 2013-02-13T23:08:52.870 回答