都什么年代了,还在用if-else判断三角形

起因:

在洛谷分支结构遇到了这道题

  这道题还挺有意思的,以前只知道怎么判断直角三角形(因为考试基本只靠直角三角形 ~_~),本来一开始没啥思路怎么判断锐角三角形和钝角三角形的,这下一下子就豁然开朗了~

  本来一开始不打算先判断两条短边和一条长边的,但是后来尝试了一下,要判断的每一种三角形里面都需要判断最小边和最大边的关系(即两边的平方和和第三边的关系),所以先判断三边的大小是写这道题代码量最少的方法~

那么问题来了,如何判断最大边和最小边呢?

传统写法:

如果按传统的想法,就是先判断最大边,剩下的两条边就是最小边啦~

这里我采用的是C语言的写法~

1.先判断最大边:

#include<stdio.h>              
int main()
{
    double edge1, edge2, edge3;
    scanf_s("%lf%lf%lf", &edge1, &edge2, &edge3);
    double max = -1;            //这里不能写为int,不然会发生隐式转换,导致小数部分被截断
    if (edge1 > edge2)
    {
        if (edge1 > edge3)
            max = edge1;
        else
            max = edge3;
    }
    else
    {
        if (edge2 > edge3)
            max = edge2;
        else
            max = edge3;
    }

    printf("%lf", max);

    return 0;                                 
}

然后再判断两条最小边:

if (max == edge1 ){
        short1 = edge2;
        short2 = edge3;
    }
    else if (max == edge2 ){
        short1 = edge1;
        short2 = edge3;
    }
    else if (max == edge3){
        short1 = edge1;
        short2 = edge2;
    }

完整源码:

#include<stdio.h>              
int main()
{
    double edge1, edge2, edge3;
    scanf_s("%lf%lf%lf", &edge1, &edge2, &edge3);
    double max = -1;             //这里不能写为int,不然会发生隐式转换,导致小数部分被截断
    double short1, short2;

    if (edge1 > edge2){          //判断最大边
        if (edge1 > edge3)
            max = edge1;
        else
            max = edge3;
    }
    else{
        if (edge2 > edge3)
            max = edge2;
        else
            max = edge3;
    }

    if (max == edge1 ){           //判断最小边
        short1 = edge2;
        short2 = edge3;
    }
    else if (max == edge2 ){
        short1 = edge1;
        short2 = edge3;
    }
    else if (max == edge3){
        short1 = edge1;
        short2 = edge2;
    }
    printf("%lf %lf %lf", max, short1, short2);

    return 0;                                 
}

可以看到还是比较复杂的,虽然不需要考虑那么多条件,但是完整的敲出来还是要个5minute+的~

那么有没有一种比较简单的方法来判断长边和两条短边的方法呢?

嘿~还真有        ^ v ^

稍微简单一点的写法:

#include<stdio.h>              
int main()
{
    double edge1, edge2, edge3;
    scanf_s("%lf%lf%lf", &edge1, &edge2, &edge3);
    double max = -1;           //这里不能写为int,不然会发生隐式转换,导致小数部分被截断
    double short1, short2;

    if (edge1 > edge2 && edge1 > edge3)         //判断最大边
        max = edge1;
    else if (edge2 > edge1 && edge2 > edge3)
        max = edge2;
    else if (edge3 > edge1 && edge3 > edge2)
        max = edge3;

    if (max == edge1 ){                         //判断最小边
        short1 = edge2;
        short2 = edge3;
    }
    else if (max == edge2 ){
        short1 = edge1;
        short2 = edge3;
    }
    else if (max == edge3){
        short1 = edge1;
        short2 = edge2;
    }
    printf("%lf %lf %lf", max, short1, short2);

    return 0;                                 
}

这种写法与传统写法相比就是在找最大边方面简单了一些,可以无脑写出来,不需要再判断 if 里面写什么,else 里面写什么~

现代很多高级语言都是自带库函数的,使用库函数能使我们的代码简略不少~

这里我以C++为例~(为什么不用C语言,因为C的库函数里没有这些函数 T^T)

使用库函数的写法:

#include <iostream>
#include <algorithm>
using namespace std;

int main() 
{
    double edge1, edge2, edge3;
    double short_e1, short_e2;
    cin >> edge1 >> edge2 >> edge3;
    
    double temp = max(edge1, edge2);              //判断最大边
    double max_e = max(temp, edge3);

    if (max_e == edge1) {                         //判断最小边
        short_e1 = edge2;
        short_e2 = edge3;
    }
    else if (max_e == edge2) {
        short_e1 = edge1;
        short_e2 = edge3;
    }
    else if (max_e == edge3) {
        short_e1 = edge1;
        short_e2 = edge2;
    }
    cout << max_e << " " << short_e1 << " " << short_e2 << endl;

    return 0;
}

可以看到,两行代码直接秒杀了,从未如此美妙的开局~

声明变量的时候一定要养成好习惯,建议在变量名后加个后缀 如 max 写为 max_v,我之前声明变量用的max,比较最大值还是用的max函数来比较的,那么编译器就傻眼了,你这个max是个啥呢?然后就给我报错,我查了半天都没有发现问题,还以为是编译器抽风了,最后是问了一个学长才解决掉 T^T

那么既然都用库函数了,那我为啥不直接用sort(排序)呢?直接一步到位~

既然要追求刺激,那就贯彻到底咯~

-------------------------------------------------------分割线-----------------------------------------------------------------

使用排序的思路:

                                 1. 先声明容量为三的数组(也可以用vector)用来存放下标

                                  2.输入三条边,用数组来保存

                                  3.之后排序,注意C++排序函数是升序排列,即最大的数在数组的末尾

                                  4.排序完成后就简单了,数组下标为0和1存储的就是较小的两条边,而数组

                                下标为2里存储的就是最大的那条边 

使用排序的源码:

#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    double edge[3] = {};
    for (int i = 0; i < 3; i++)
        cin >> edge[i];
    sort(edge, edge + 3);
    
    cout << edge[0] << " " << edge[1] << " " << edge[2] << endl;

    if (edge[0] + edge[1] > edge[2])            //两边之和大于第三边
        cout << "Is triangle" << endl;
    else
        cout << "Not triangle" << endl;

    return 0;
}

 是不是如此的简洁?如果用传统方法比这代码长了4倍不止,而且还容易出错,用数组(或vector)+ 排序直接嘎嘎乱杀 ^o^

这种方法我一开始也没有想到,我想到的方法是用max函数判断出最大边,然后再去判断最小边,这样确实复杂了一点,当时做题的时候就感觉到有点复杂,但是当时想不到比这更好的方法了,直到看到题解里大佬的代码才豁然开朗,原来还可以这么简单~

贴个题目在这:

第一次我提交的答案:

#include <iostream>
#include<cmath>
using namespace std;

int main()
{
    int short_e[2];                 // 存储两条短边的边长
    int long_e;                     // 存储最长边的边长 
    int edge1, edge2, edge3; 
    cin >> edge1 >> edge2 >> edge3;

    // 判断三条边是否相同
    if (edge1 == edge2 && edge2 == edge3 && edge1 == edge3)
    {
        long_e = edge1;             
        short_e[0] = edge2;         
        short_e[1] = edge3;       
    }
    else
    {
        int temp = max(edge1, edge2);       
        long_e = max(temp, edge3);                      // 取最大边长作为最长边长

        if (edge1 != long_e && edge2 != long_e)         // 如果第一条边和第二条边都不是最长边
        {
            short_e[0] = edge1;                         // 取第一条边作为第一条短边长
            short_e[1] = edge2;                         // 取第二条边作为第二条短边长
        }
        else if (edge2 != long_e && edge3 != long_e)    // 如果第二条边和第三条边都不是最长边
        {
            short_e[0] = edge2;                         // 取第二条边作为第一条短边长
            short_e[1] = edge3;                         // 取第三条边作为第二条短边长
        }
        else if (edge1 != long_e && edge3 != long_e)    // 如果第一条边和第三条边都不是最长边
        {
            short_e[0] = edge1;                         // 取第一条边作为第一条短边长
            short_e[1] = edge3;                         // 取第三条边作为第二条短边长
        }
    }

    // 判断三角形类型
    if (short_e[0] + short_e[1] > long_e)
    {
        if (pow(short_e[0], 2) + pow(short_e[1], 2) == pow(long_e, 2)) // 如果两条短边的平方和等于最长边的平方
            cout << "Right triangle" << endl;
        if (pow(short_e[0], 2) + pow(short_e[1], 2) > pow(long_e, 2)) // 如果两条短边的平方和大于最长边的平方
            cout << "Acute triangle" << endl;
        if (pow(short_e[0], 2) + pow(short_e[1], 2) < pow(long_e, 2)) // 如果两条短边的平方和小于最长边的平方
            cout << "Obtuse triangle" << endl;
        if (short_e[0] == short_e[1])                                 // 如果两条短边相等
            cout << "Isosceles triangle" << endl;
        if (long_e == short_e[0] && long_e == short_e[1] && short_e[0] == short_e[1]) // 如果三条边相等
            cout << "Equilateral triangle" << endl;
    }
    else
        cout << "Not triangle" << endl;
    return 0;
}

代码有点多,但好在一次就过了~

第二次用排序思路重新做了一下:

#include <iostream>
#include <algorithm>
#include<cmath>
using namespace std;

int main()
{
    int edge[3];                
    for (int i = 0; i < 3; i++)
        cin >> edge[i];
    sort(edge, edge + 3);

    if (edge[0] + edge[1] > edge[2])
    {
        if (pow(edge[0], 2) + pow(edge[1], 2) == pow(edge[2], 2)) // 如果两条短边的平方和等于最长边的平方
            cout << "Right triangle" << endl;
        if (pow(edge[0], 2) + pow(edge[1], 2) > pow(edge[2], 2))  // 如果两条短边的平方和大于最长边的平方
            cout << "Acute triangle" << endl;
        if (pow(edge[0], 2) + pow(edge[1], 2) < pow(edge[2], 2))  // 如果两条短边的平方和小于最长边的平方
            cout << "Obtuse triangle" << endl;
        if (edge[0] == edge[1])                                   // 如果两条短边相等
            cout << "Isosceles triangle" << endl;
        if (edge[2] == edge[0] && edge[2] == edge[1] && edge[0] == edge[1]) // 如果三条边相等
            cout << "Equilateral triangle" << endl;
    }
    else
        cout << "Not triangle" << endl;
    return 0;
}

what's up 直接把代码量砍半了~        ^o^

总结:

  正如维新派的领袖:理塘.顶真所说:“创新是带着勇气和冒险,以新的视角看待世界,并激发变革的力量。”,很多时候我们不能沦陷于已掌握方法的温柔乡,而是要以新的视角和方法来看待同一个问题,找出问题目前的最优解并加以学习,这样我们的能力才会有所增长,世界也会因为我们而变的越来的公平,美好,和正义~

  借用崩三里的一句话:为世界上所有美好而战!

  三角形的判断除了用传统的 if-else 以外,还可以使用库函数来简化代码,最优的写法就是数组+排序,不到5行代码解决传统方法20行都解决不了的问题,嘎嘎好用!

补充一个知识点:

        当两短边的平方和大于一长边的平方,说明是锐角三角形。

        当两短边的平方和等于一长边的平方,说明是直角三角形。

        当两短边的平方和小于一长边的平方,说明是钝角三角形。

这次还好,才写了一坤时,还以为又要用6小时呢~

如果您觉得这篇文章对您有帮助的话,那不妨点个赞或者收藏呗,谢谢您~

如果您觉得我的文章有问题,请您私信我,我看到后就会及时改正,谢谢您!

感谢您的阅读!

  • 21
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值