《信息学奥赛一本通》第30题:计算三角形面积
题目描述
平面上有一个三角形,它的三个顶点坐标分别为 ( x 1 , y 1 ) , ( x 2 , y 2 ) , ( x 3 , y 3 ) (x_1,y_1),(x_2,y_2),(x_3,y_3) (x1,y1),(x2,y2),(x3,y3),那么请问这个三角形的面积是多少。
输入格式
输入仅一行,包括 6 6 6 个双精度浮点数,分别对应 x 1 , y 1 , x 2 , y 2 , x 3 , y 3 x_1,y_1,x_2,y_2,x_3,y_3 x1,y1,x2,y2,x3,y3。坐标的绝对值不超过 100 100 100,且小数点后最多只有一位。
输出格式
输出也是一行,输出三角形的面积,精确到小数点后两位。
输入输出样例 #1
输入 #1
0 0 4 0 0 3
输出 #1
6.00

大家好,我是莫小特。
这篇文章给大家带来《信息学奥赛一本通》中的第 30 题:计算三角形面积。
一、题目描述
洛谷的题号是:B2031 计算三角形面积

二、题意分析
这道题是信息学奥赛一本通练习题的第 30 题。
根据输入格式描述,输入只有一行,有 6 个双精度浮点数,绝对值不超过 100,所以使用 double 类型。
cpp
double x1,y1,x2,y2,x3,y3;
cin>>x1>>y1>>x2>>y2>>x3>>y3;
输入完成后,我们来分析题意,要根据三个点确定一个三角形,按样例输入的数据,可以画出这个三角形。

这个三角形是比较规矩的,利用三角形面积公式: 三角形面积 = ( 底 × 高 ) 2 三角形面积=\frac{(底\times 高)}{2} 三角形面积=2(底×高),但是如果是下面这样的三角形,那无法通过这个面积公式来实现。

但是可以根据海伦公式
S = p ( p − a ) ( p − b ) ( p − c ) S=\sqrt{p(p-a)(p-b)(p-c)} S=p(p−a)(p−b)(p−c)
其中, p = a + b + c 2 p=\frac{a+b+c}{2} p=2a+b+c,也就是三角形周长的一半。
所以我们需要根据三个点来求得三条边的长度,根据线段公式,可以得到以下式子:
AB 的长度: ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 \sqrt{(x1-x2)^2+(y1-y2)^2} (x1−x2)2+(y1−y2)2
BC 的长度: ( x 2 − x 3 ) 2 + ( y 2 − y 3 ) 2 \sqrt{(x2-x3)^2+(y2-y3)^2} (x2−x3)2+(y2−y3)2
AC 的长度: ( x 1 − x 3 ) 2 + ( y 1 − y 3 ) 2 \sqrt{(x1-x3)^2+(y1-y3)^2} (x1−x3)2+(y1−y3)2
转换为程序语言,需要使用 sqrt() 函数,记得加 #include<cmath>
头文件哦!
cpp
#include<cmath>
double ab=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
double bc=sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));
double ac=sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));
在利用海伦公式来求面积,新建一个 double 类型变量先存储周长的一半,再定义一个 double 类型变量来存储面积。
cpp
double p=(ab+bc+ac)/2.0;
double s=sqrt(p*(p-ab)*(p-ac)*(p-bc));
输出保留小数点后两位。
cpp
printf("%.2lf",s);
按样例输入来验证数据。

符合样例输出的格式,到网站提交测评。

三、完整代码
该题的完整代码如下:
cpp
#include <cmath>
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main()
{
double x1,y1,x2,y2,x3,y3;
cin>>x1>>y1>>x2>>y2>>x3>>y3;
double ab=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
double ac=sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));
double bc=sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));
double p=(ab+ac+bc)/2.0;
double s=sqrt(p*(p-ab)*(p-ac)*(p-bc));//海伦公式
printf("%.2lf",s);
return 0;
}
四、总结
本题考查的是几何基础计算+数学公式的程序实现,尤其是海伦公式的灵活运用,在信息学普及组中属于中等难度的数学类题目,具有以下几个关键点:
技巧一:灵活选择面积公式,海伦公式适应性更强
常规的 底 × 高 2 \frac{底 \times 高}{2} 2底×高 面积公式仅适用于可明确底高的直角三角形;
更通用的是海伦公式:
S = p ( p − a ) ( p − b ) ( p − c ) S=\sqrt{p(p-a)(p-b)(p-c)} S=p(p−a)(p−b)(p−c)
其中, p = a + b + c 2 p=\frac{a+b+c}{2} p=2a+b+c,也就是三角形周长的一半。
掌握该公式,几乎可以求任意三角形面积。
技巧二:三边长度用勾股定理计算,不能用坐标差值直接替代
给出的是点的坐标,需要用两点间距离公式:
距离 = ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 距离=\sqrt{(x1-x2)^2+(y1-y2)^2} 距离=(x1−x2)2+(y1−y2)2
需要使用 sqrt() 函数,记得引入 头文件;
所有计算中统一使用 double 类型,防止精度丢失。
技巧三:输出格式精度控制,使用 printf("%.2lf", ...)
要求保留两位小数,需使用 printf 控制输出,printf("%.2lf", s) 是最常见写法,避免 cout 输出精度不一致的问题。
---end---
如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注我哦!
我们下集见~