找到独特的毕达哥拉斯三重奏
我试图从一系列毕达哥拉斯三元组中排除重复的三角形,这些三角形只打印出具有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
因为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 2 – n 2 )
b = k ·(2 mn )
c = k ·( m 2 + n 2 )
其中k , m和n是正整数, m和n是互质的(意思是它们的最大公分母是1), m或n是偶数。
怎么样(if(abs(ab) 此外,在第一个if结构中使用相同的不等式(在某处定义EPSILON)。 自从我进行C编码以来已经有一段时间了,但是双重或浮点数的相等性往往会得到错误的结果。 除非它们都是整数,在这种情况下(a == b)与(b == a)相同,不确定为什么两者都有。