C++ 查找唯一的毕达哥拉斯三元组

C++ 查找唯一的毕达哥拉斯三元组,c++,c,C++,C,我试图从毕达哥拉斯三元组序列中排除重复三角形,该序列只打印斜边为100的三角形,但我在排除部分所做的工作失败了。。。我的意见如下: .... int one_hundred = 0, if( (a*a) + (b*b) == (h*h) ){ //exclusion if((a == b)){ continue; }else { //Just prints the the triangl

我试图从毕达哥拉斯三元组序列中排除重复三角形,该序列只打印斜边为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;

           }

      .....

     }
我认为通过比较a==b,我会得到相同的结果,但我没有:

if((a == b)){

    continue;

    }
希望这能澄清我想做什么

再次感谢你

(如果(abs(a-b) 另外,在第一个if结构中使用相同的不等式(在某处定义EPSILON)

我已经有一段时间没有做C编码了,但双精度或浮点数的相等性通常会得到错误的结果。除非它们都是整数,在这种情况下(a==b)与(b==a)是相同的,否则不确定为什么两者都有。

如果(abs(a-b) 另外,在第一个if结构中使用相同的不等式(在某处定义EPSILON)


我已经有一段时间没有做C编码了,但双精度或浮点数的相等性通常会得到错误的结果。除非它们都是整数,在这种情况下(a==b)与(b==a)是相同的,否则不确定为什么两者都有。

从勾股三元组序列中过滤出重复项是相当困难的,因为要进行大量比较,您需要永久记住所有旧的三元组

一个更好的方法就是不要一开始就产生重复。为此,您可以使用这组公式(来自):

a=k·(m2-n2)
b=k·(2mn)
c=k·(m2+n2)


其中k、m和n是正整数,m和n是互质(意味着它们的最大公分母是1),m或n是偶数。

从毕达哥拉斯三元组序列中过滤出重复项是相当困难的,因为为了进行大量比较,您需要永久记住所有旧的三元组

一个更好的方法就是不要一开始就产生重复。为此,您可以使用这组公式(来自):

a=k·(m2-n2)
b=k·(2mn)
c=k·(m2+n2)


其中k、m和n是正整数,m和n是互质(意味着它们的最大公分母是1),m或n是偶数。

我认为一个简单的方法是创建一个
std::vector 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;
                }
            }
        }
    }
}
这就是我认为你在期望结果示例中的意思。否则,您需要创建一个规则来双重打印某些规则。在这种情况下,您可以添加一个
开关(){}
。没那么难,就算没那么优雅,伊莫

注意:
实际上没有必要将
state->at(i)
更改为
false
,因为
i
是递增的,不会再被触摸。但它在那里,以防你以后需要使用潜艇。索引0和1已被忽略,因为三角形的任何一侧都不能为0,如果其中一个可行,则另一侧必须等于
h
,因此不要浪费宝贵的时间。如果你真的抓住了它们,请记住0和1从一开始就是
true
,应该设置为false。

我认为一个简单的方法是创建
std::vector状态(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;
                }
            }
        }
    }
}
这就是我认为你在期望结果示例中的意思。否则,您需要创建一个规则来双重打印某些规则。在这种情况下,您可以添加一个
开关(){}
。没那么难,就算没那么优雅,伊莫

注意:
实际上没有必要将
state->at(i)
更改为
false
,因为
i
是递增的,不会再被触摸。但它在那里,以防你以后需要使用潜艇。索引0和1已被忽略,因为三角形的任何一侧都不能为0,如果其中一个可行,则另一侧必须等于
h
,因此不要浪费宝贵的时间。如果您确实保留了它们,请记住0和1从一开始就是
true
,应该设置为false。

不清楚这里的问题是什么。请准确描述问题所在(即,您的行为以及您预期的行为)。另外,
(a==b)|(b==a)
是多余的…你说的“重复三角形”是什么意思?你没有检查重复。您正在检查a==b,并且由于(a==b)==(b==a)总是重复执行此操作。还要注意,毕达哥拉斯三元组不能包含相同的数字两次。@user1179105为什么允许出现这种情况?只要确保
a
始终保持不变(因此,如果您尝试
b
的值,请确保不要尝试任何小于
a
的值)。然而,raukh为您提供了更好的方法来系统地生成三角形。现在还不清楚问题出在哪里。请准确描述问题所在(即,您的行为以及您预期的行为)。另外,
(a==b)|(b==a)
是多余的…你说的“重复三角形”是什么意思?你没有检查重复。你正在检查
28 96 100
60 80 100