这个题目有一段时间了,不过当时正在准备考试,纵使有心刷题,奈何佛脚得抱,后来又被撤了,所以拖至今天...
如题:一个三角形必然存在它的内切圆与外接圆,求他们的面积比。
考虑到精度问题,我们输出面积比*1000的整数部分(直接下取整)。
输入数据是一个三角形的三个顶点,但这三个顶点在三维空间中,所以输入是9个整数,分别表示三个顶点(x1,y1,z1) (x2,y2,z2) (x3,y3,z3),保证三点不共线,每个整数在-1000,+1000范围内。
输出内接圆与外切圆的面积比*1000的整数部分。
题目我就不说了,有点小问题,当时在群里面争论得还挺厉害的...如最后的输出:内接圆与外切圆的面积比*1000的整数部分。
咱们就当是出题人的不小心所致,即输出内切圆和外接圆的面积比*1000;
说到底,这是一题水题,内切圆与外接圆,这是在考数学吗?
下面说公式,这是群里面当时别人贴出的,借鉴了,一般人我不告诉他...开句玩笑,这个随便就百度了,抑或是查数学书了;
内切圆半径:r=2 * S / (a + b + c),其中S是三角形面积,a、b、c是三角形三边。
外接圆半径:R=a * b * c / (4 * S),公式不多证明...
其中S的计算面积就不用多说了吧,S=√[p(p - a)(p - b)(p - c)],其中p = (a + b + c) / 2;
至此,告一段落了...
#include <stdio.h>
#include <iostream>
#include <cmath>
#include <string>
using namespace std;
class Test {
public:
static int ratio (int x1,int y1,int z1,
int x2,int y2,int z2,
int x3,int y3,int z3)
{
//内切圆半径:r=2 * S / (a + b + c),其中S是三角形面积,a、b、c是三角形三边。
//外接圆半径:R=a * b * c / (4 * S);
float c = sqrtf((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2) + (z1 - z2)*(z1 - z2));
float a = sqrtf((x3 - x2)*(x3 - x2) + (y3 - y2)*(y3 - y2) + (z3 - z2)*(z3 - z2));
float b = sqrtf((x1 - x3)*(x1 - x3) + (y1 - y3)*(y1 - y3) + (z1 - z3)*(z1 - z3));
if(a + b <= c || b + c <= a || c + a <= b)
return 0;
float p = (a + b + c) / 2; //
float s = sqrtf(p * (p - a) * (p - b) * (p - c)); //三角形面积
float r = 2 * s / (a + b + c); //内切圆半径
float R = a * b * c / (4 * s); //外接圆半径
return (int)(1000 * r * r / R / R); //面积比πr²
}
};
//start 提示:自动阅卷起始唯一标识,请勿删除或增加。
int main()
{
cout<<Test::ratio(0,0,0,0,1,0,0,0,1)<<endl;
}
//end //提示:自动阅卷结束唯一标识,请勿删除或增加。
*∩_∩*