三角形的内切圆和外接圆--【英雄会】

这个题目有一段时间了,不过当时正在准备考试,纵使有心刷题,奈何佛脚得抱,后来又被撤了,所以拖至今天...

如题:一个三角形必然存在它的内切圆外接圆,求他们的面积比。

考虑到精度问题,我们输出面积比*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 //提示:自动阅卷结束唯一标识,请勿删除或增加。

*∩_∩*
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值