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

我试图从一系列毕达哥拉斯三元组中排除重复的三角形,这些三角形只打印出具有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; } 

希望这澄清了我想要做的事情……

再次感谢你!!

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

 bool loop; std::vector *state = new std::vector(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)更改为false因为i递增并且永远不会再次触摸。 但是如果您以后需要使用潜艇,那就在那里。 索引0和1被忽略,因为三角形的任何一边都不能为0,如果一个是可行的,另一边必须等于h所以不要浪费宝贵的时间。 如果你确实坚持他们,请记住0和1是true开始,应该设置为false。

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

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

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

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

怎么样(if(abs(ab)

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

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