我试图从一系列毕达哥拉斯三元组中排除重复的三角形,这些三角形只打印具有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;
}
希望这能澄清我想要做的事情......
再次感谢你!!
答案 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)
更改为false
,i
会增加,并且永远不会再次触及。但是如果您以后需要使用潜艇的话就在那里。索引0和1已被忽略,因为三角形的任何一边都不能为0,如果一个是可行的,另一边必须等于h
,所以不要浪费宝贵的时间。如果您确实坚持他们,请记住0和1是true
开头,应该设置为false。