【GESP】C++二级练习 luogu-B3638, 三角形面积
GESP二级练习,数学函数练习,难度★✮☆☆☆。
luogu-B3638
题目要求
题目描述
给定平面直角坐标系上的三个整点 $A, B, C$ 的坐标,求其围成的三角形面积。
数据保证答案一定是整数。所以如果你采用了浮点数来计算,请四舍五入到整数。
两点之间的距离公式: $(x_1, y_1), (x_2, y_2)$ 之间的距离是 $\sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2}$
海伦公式: 若三角形的边长为 $a, b, c$,则三角形的面积是 $\sqrt{s(s-a)(s-b)(s-c)}$,其中 $s=\frac12(a+b+c)$.
输入格式
共三行,每行表示一个三角形上的点。 每行包含两个正整数,表示点的坐标,形式为
x y
。
输出格式
共一行,一个整数,表示三角形面积。
样例输入 #1
1
2
3
10 20
30 40
50 50
样例输出 #1
1
100
样例解释
可以通过海伦公式计算面积。方法如下。
$AB$ 距离:$\sqrt{(30 - 10)^2 + (40 -20)^2} \approx 28.284$
$BC$ 距离:$\sqrt{(50-30)^2 + (50-40)^2} \approx 22.361$
$AC$ 距离:$\sqrt{(50-10)^2+(50-20)^2}\approx 50$
应用海伦公式,$s \approx (28.284 + 22.361 + 50) / 2 \approx 50.323$
求出近似面积: $\sqrt{s(s-a)(s-b)(s-c)} \approx \sqrt{10016.80} \approx 100.08$,故答案为 $100$。
数据规模与约定
对于 $100\%$ 的数据:每个点的 $x, y$ 坐标值一定在 $[1, 200]$ 之内,均为整数;答案一定为正整数。
题目分析
- 读取三个点的坐标
- 使用sqrt函数计算三个点之间的距离
- 计算三角形的半周长
- 使用sqrt函数计算三角形的面积
- 输出三角形的面积
示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <cmath>
#include <cstdio>
#include <iostream>
using namespace std;
int main() {
// 读取三个点的坐标
int x1, y1, x2, y2, x3, y3;
cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
// 计算三个点之间的距离
double a, b, c;
a = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); // 计算AB距离
b = sqrt((x1 - x3) * (x1 - x3) + (y1 - y3) * (y1 - y3)); // 计算AC距离
c = sqrt((x2 - x3) * (x2 - x3) + (y2 - y3) * (y2 - y3)); // 计算BC距离
// 计算三角形的半周长
double tmp = (a + b + c) / 2;
// 计算三角形的面积
double s = sqrt(tmp * (tmp - a) * (tmp - b) * (tmp - c));
// 输出三角形的面积
printf("%.0f", s);
return 0;
}
所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code
GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页
“luogu-”系列题目已加入洛谷Java、C++初学团队,作业清单,可在线评测,团队名额有限,欢迎加入。
“bcqm-”系列题目可在编程启蒙题库进行在线评测。