南邮OJ 1013 判断三角形

题目描述给定三条边的长度,判断能否组成三角形,如果可以,判断三角形的形状。

题目链接:点击打开链接

<span style="font-family:SimSun;font-size:14px;">#include <iostream>
#include <cmath>
using namespace std;
int main()
{
	double a[3]={};
	cin >> a[0] >> a[1] >> a[2];
	while ((a[0] !=0 )||(a[1]!=0)||(a[2]!=0))
	{
	 if ((a[0]+a[1] > a[2])&&(a[2]+a[1] > a[0])&&(a[2]+a[1] > a[0]))
	   {
		 if ((((a[0]==a[1])&&(a[0]!=a[2]))||((a[0]==a[2])&&(a[0]!=a[1]))||((a[2]==a[1])&&(a[1]!=a[0])))
			&& ((fabs(a[0]*a[0]-a[1]*a[1]-a[2]*a[2])<0.001)||(fabs(a[1]*a[1]-a[0]*a[0]-a[2]*a[2])<0.001)
			||(fabs(a[2]*a[2]-a[1]*a[1]-a[0]*a[0])<0.001)))
		 {
			cout << "“Isosceles right triangle”" << endl;
		 }
		 else  if ((fabs(a[0]*a[0]-a[1]*a[1]-a[2]*a[2])<0.001)||(fabs(a[1]*a[1]-a[0]*a[0]-a[2]*a[2])<0.001)
			||(fabs(a[2]*a[2]-a[1]*a[1]-a[0]*a[0])<0.001))
		 {
			cout << "“Right triangle”" << endl;
		 }
		 else  if (((a[0]==a[1])&&(a[0]!=a[2]))||((a[0]==a[2])&&(a[0]!=a[1]))||((a[2]==a[1])&&(a[1]!=a[0])))
		 {
		 	cout << "“Isosceles triangle”" << endl;
		 }
		 else  if ((a[0]==a[1])&&(a[1]==a[2]))
		 {
			cout << "“Equilateral triangle”" <<endl;
		 }
	     else
	     {
		    cout << "“General triangle”" << endl;
     	 }
	 }
	 else
	 {
		cout << "“Not a triangle”" << endl;
	 }
	 cin >> a[0] >> a[1] >> a[2];
	}
	cout << "End"  << endl;
	return 0;
}</span>

这是我个人写的代码,怎么提交都不行,后来看到别人的代码顿时觉得自己真的是太low了。思想都没有搞清楚!

<span style="font-family:SimSun;font-size:14px;">#include<iostream>
#include<cmath>
using namespace std;
int main()
{
     float a,b,c;
     cin>>a>>b>>c;
     while((a!=0)&&(b!=0)&&(c!=0))
    {
       if((a+b-c>=0.001)&&(b+c-a>=0.001)&&(c+a-b>=0.001))
       {
	  if((fabs(a-b)<0.001)&&(fabs(a-c)<0.001))
		cout<<"Equilateral triangle"<<endl;
	  else{
		if((fabs(a-b)<0.001)||(fabs(b-c)<0.001)||(fabs(a-c)<0.001))
		{
		   if((fabs(a*a-b*b-c*c)<0.001)||(fabs(b*b-a*a-c*c)<0.001)||(fabs(c*c-a*a-b*b)<0.001))
				cout<<"Isosceles right triangle"<<endl;
		   else
		      cout<<"Isosceles triangle"<<endl;
		}
		else
		{
		   if((fabs(a*a-b*b-c*c)<0.0001)||(fabs(b*b-a*a-c*c)<0.0001)||(fabs(c*c-a*a-b*b)<0.0001))
				cout<<"Right triangle"<<endl;
		   else
			cout<<"General triangle"<<endl;
		}
	      }
	   }
	else
		cout<<"Not a triangle"<<endl;
		cin>>a>>b>>c;
	}
	cout<<"End"<<endl;
	return 0;
}</span>

       首先思想上的分析:第一,考虑三条边都是相等的,即为等边三角形。第二,有两条边相等的,即为等腰三角形。如果有两边相等且构成直角三角形的,即为等腰直角三角形。第三,当三条边都不相等时,考虑是否可以构成直角三角形。第四,剩下来的就是一般的三角形了。当然前提是要能构成三角形!

       另外题目的精确度,之前没有考虑到,一直以为没有用的,后来看到别人的代码才知道是有用的!将一些关系进行转换,用于精确度。本题中的精确度精度为0.0001,如果是0.00001的话提交会有错误!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值