起因:
在洛谷分支结构遇到了这道题
这道题还挺有意思的,以前只知道怎么判断直角三角形(因为考试基本只靠直角三角形 ~_~),本来一开始没啥思路怎么判断锐角三角形和钝角三角形的,这下一下子就豁然开朗了~
本来一开始不打算先判断两条短边和一条长边的,但是后来尝试了一下,要判断的每一种三角形里面都需要判断最小边和最大边的关系(即两边的平方和和第三边的关系),所以先判断三边的大小是写这道题代码量最少的方法~
那么问题来了,如何判断最大边和最小边呢?
传统写法:
如果按传统的想法,就是先判断最大边,剩下的两条边就是最小边啦~
这里我采用的是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小时呢~
如果您觉得这篇文章对您有帮助的话,那不妨点个赞或者收藏呗,谢谢您~
如果您觉得我的文章有问题,请您私信我,我看到后就会及时改正,谢谢您!