【问题标题】:How to check if 3 sides form a triangle in C++如何在C ++中检查3条边是否形成三角形
【发布时间】:2019-04-21 03:02:50
【问题描述】:

我正在尝试检查 3 个边是否在 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;
}

【问题讨论】:

  • 我认为任意两条边之和大于三边或任意两条边之差小于三边?是检查它的简单方法..
  • 并非所有三角形都有直角。
  • 我不认为您的直角三角形公式是正确的,除非我很愚蠢并且您正在做一些不同的事情。毕达哥拉斯是 a^2 = b^2 + c^2 不是时间
  • 您的程序背后的数学推理是什么? (如果您正在检查直角三角形,那应该是 + 而不是 *
  • 您必须记住 pow 正在处理浮点值,因此您可能需要阅读 What Every Computer Scientist Should Know About Floating-Point Arithmetic

标签: c++ geometry


【解决方案1】:

假设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;
}

【讨论】:

  • 解释你的答案。 SO 不是编码转储服务。
  • 您还需要检查差异,即两侧之间的差异应小于第三侧
  • @HVar 举个例子,当提到的测试满足,但是我们不能用这些长度创建三角形。
  • &gt;=。退化的三角形仍然是三角形。
【解决方案2】:

要检查的三角形条件,

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

【讨论】:

  • 我觉得上面三个条件就够了
  • @david - 抱歉,似乎只有 3 个条件。我不知道,但我记得也必须找出差异。看来我错了。已编辑答案
  • @user2943407 - 是的,它可以是任何顺序。仅当所有值都是正数时,您才需要检查绝对值
【解决方案3】:

对于一个普通的三角形

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

【讨论】:

    【解决方案4】:

    假设您只测试直角三角形,那么使用的逻辑是 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 个浮点数是否足够接近,然后将其用于比较。

    如果您不想将您的方法限制为仅使用直角三角形,那么您可能希望阅读triangle inequality。总之,三角形不等式只是说明三角形中任何一条边的长度必须小于其他两条边的总和。

    【讨论】:

    • 除了说一般逻辑是正确的外,这个答案大部分都可以;不是,因为他把公式打错了。
    • @LightnessRacesinOrbit,感谢您指出这一点,我第一次浏览时错过了。
    • 他的初始值是整数。对于像pow( x, 2 ) 这样的简单情况,从范围内的整数值开始应该给出一个精确值;如果没有,图书馆的质量很差。如果您更喜欢保证准确的结果,请将pow( x, 2 ) 替换为x * x。只要没有溢出,就保证了结果(因为只涉及整数运算——但通常的 IEEE 格式也保证x * x 的精确结果,只要初始值实际上是整数,并且结果更少超过 2^52。
    【解决方案5】:

    一种有效的方法是对给定的边进行排序。如果给定整个数组并且询问给定数组元素是否形成三角形,这将是有效的。这可以应用于 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;
    }
    

    【讨论】:

      【解决方案6】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2019-03-11
        • 1970-01-01
        • 2020-02-05
        • 2011-05-11
        • 1970-01-01
        • 2020-07-11
        • 2016-01-07
        • 2023-01-30
        • 2022-01-23
        相关资源
        最近更新 更多