如何在C++中检查三条边是否能够构成三角形

6
我正在尝试在C++中检查三条边是否构成三角形,但是对于所有我尝试的可能数字,它都会显示错误...
#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    int a, b, c;

    cin >> a >> b >> c;

    if (pow(a,2) == pow(b,2) * pow(c,2) || pow(b,2) == pow(a,2) * pow(c,2) || pow(c,2) == pow(a,2) * pow(b,2))
        cout << "The sides form a triangle" << endl;
    else
        cout << "The sides do not form a triangle." << endl;
    return 0;
}

例如...?嗯,我不认为这是一个有效的“三角形检测机制”。或许是直角三角形,尽管你应该使用+而不是*。你忘记解释“形式”的含义了,而且你的代码没有错误检查。 - Lightness Races in Orbit
3
我认为任意两条边的长度之和大于第三边的长度,或者任意两条边的长度之差小于第三边的长度?这是一种简单的检查方法.. - niko
2
并非所有的三角形都有一个直角。 - Pontus Gagge
1
我认为你的直角三角形公式不正确,除非我很蠢,而你在做一些不同的事情。勾股定理是a^2 = b^2 + c^2,而不是乘以。 - T. Kiley
2
你的程序背后的数学推理是什么?(如果你正在检查一个直角三角形,那应该用“+”而不是“*”) - bereal
2
你必须记住,pow 是使用浮点数值进行计算的,因此你可能需要阅读《计算机科学家应该了解的浮点运算知识》 - Some programmer dude
6个回答

20

假设a,b,c是三角形的三条边。因此,它必须满足以下标准:

  1. a + b > c
  2. a + c > b
  3. b + c > a

所有条件都必须为真。如果其中一个不成立,则a,b,c将不能构成三角形。

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    int a, b, c;
    cin >> a >> b >> c;
    // check whether a, b, c can form a triangle
    if (a+b > c && a+c > b && b+c > a)
        cout << "The sides form a triangle" << endl;
    else
        cout << "The sides do not form a triangle." << endl;
    return 0;
}

10
请解释您的答案。SO不是一个用于倾倒代码的服务。 - Lightness Races in Orbit
你还需要检查差异,即两边之间的差异应小于第三边。 - HVar
1
@HVar 给出一个例子,当满足所提到的测试时,我们无法用这些长度创建三角形。 - Muhamed Huseinbašić
详见此处 - http://www.mathwarehouse.com/geometry/triangles/triangle-inequality-theorem-rule-explained.php - roottraveller
>=. 退化三角形仍然是三角形。 - n0rd

3

需要检查的三角形条件:

(a + b > c),
(b + c > a),
(c + a > b)

1
我认为仅以上三个条件就足够了。 - david
@david - 抱歉,似乎只有3个条件。我不确定,但我记得还要找出差异。看来我错了。已编辑答案。 - HVar
是的,它可以是任何顺序。只要所有值都为正数,就需要检查绝对值。 - HVar

2

对于一个普通的三角形

1. sum of any two sides is greater than third side (or)
2. difference of any two sides is less than third side

hint :  a+b > c || ...

对于一个直角三角形

1) sum of the squares of two sides equals the square of the longest side

提示:
Find the longest side of three sides, that is find longest number in the three..
square the remaining two nums, add them and equate it to square of longest number

1
假设您只测试直角三角形,则使用的逻辑是z^2 = x^2 + y+2。因此,逻辑上存在错误:
 if (pow(a,2) == pow(b,2) * pow(c,2) || pow(b,2) == pow(a,2) * pow(c,2) || pow(c,2) == pow(a,2) * pow(b,2))

这应该是:

 if (pow(a,2) == pow(b,2) + pow(c,2) || pow(b,2) == pow(a,2) + pow(c,2) || pow(c,2) == pow(a,2) + pow(b,2))

即使有这个更改,由于测试浮点数的相等性可能导致结果错误。创建一个特定的函数来测试2个浮点数是否足够接近,给定一些你决定的公差,然后将其用于比较。

如果您不想限制您的方法只适用于直角三角形,那么您可能希望阅读三角不等式。简而言之,三角不等式只是指三角形中任何边的长度必须小于另外两条边的长度之和。


这个答案大部分还好,除了说一般逻辑是正确的这一点;实际上不是,因为他打错了公式。 - Lightness Races in Orbit
@LightnessRacesinOrbit,感谢您指出这一点,我第一次看的时候错过了,只是匆匆浏览了一下。 - shuttle87
他的初始值是整数。对于像 pow(x, 2) 这样的简单情况,从范围内开始使用整数值应该会给出一个精确的值;如果没有,那么库的质量就相当糟糕。如果您希望结果保证精确,请将 pow(x, 2) 替换为 x * x。只要没有溢出,结果就是保证的(因为只涉及整数算术——但通常的 IEEE 格式也保证了 x * x 的精确结果,只要初始值实际上是整数,并且结果小于 2^52)。 - James Kanze

0
一种高效的方法是对给定的边进行排序。如果您获得了整个数组并被要求确定给定的数组元素是否形成三角形,则这将是有效的。这可以应用于n个给定的边。 但是,这也可以应用于3条边。假设给定的数组为b。在您的情况下,数组b的长度为h=3。
sort(b,b+h);
for (int j=0;j<(h-2);j++){
    if (b[j]+b[j+1]>b[j+2])
    {
return true;
    }
}
else {
return false;
}

-1

实际上,只要给定任意三边,您只需要检查一个条件:最长的一条边(假设为c)小于另外两条较短的边之和(假设为a和b)。也就是说,

if c < a+b {
   return true;
} else return false;

这就是三角不等式定理的本质。当它是一个三角形时,其他条件将是显然成立的,如果没有这个条件,则无关紧要。当然,关键是通过使用简单的排序算法对三条边进行排序,以找到最长的一边。代码中的假设是边已经被排序,因此c是最长的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接