题解:洛谷 P5708 三角形面积
【题目来源】
【题目描述】
一个三角形的三边长分别是 \(a\)、\(b\)、\(c\),那么它的面积为 \(\sqrt {p(p-a)(p-b)(p-c)}\),其中 \(p = \frac{1}{2}(a+b+c)\)。输入这三个数字,计算三角形的面积,四舍五入精确到 \(1\) 位小数。
【输入】
第一行输入三个实数 \(a\)\(,\)\(b\)\(,\)\(c\),以空格隔开。
【输出】
输出一个实数,表示三角形面积。精确到小数点后 \(1\) 位。
【输入样例】
3 4 5
【输出样例】
6.0
【核心思想】
-
问题分析:给定三角形三边长 \(a, b, c\),利用海伦公式计算面积:\(p = \frac{a+b+c}{2}\),\(S = \sqrt{p(p-a)(p-b)(p-c)}\),结果四舍五入精确到小数点后 \(1\) 位。
-
算法选择:
- 海伦公式:已知三边求面积的经典公式,无需判断三角形类型
- 数学库函数:使用
sqrt()计算平方根,printf格式化保留一位小数
-
关键步骤:
- 读入数据:
cin >> a >> b >> c读取三边长 - 计算半周长:\(p = 0.5 \times (a + b + c)\)
- 计算被开方数:\(t = p \times (p - a) \times (p - b) \times (p - c)\)
- 开方得面积:
ans = sqrt(t) - 格式化输出:
printf("%.1f", ans)保留一位小数
- 读入数据:
-
时间/空间复杂度:
- 时间复杂度:\(O(1)\),固定次数的算术运算和一次开方
- 空间复杂度:\(O(1)\),仅需常数个变量
-
数学公式的核心思想:
- 海伦公式普适性:对任意三角形(只要满足两边之和大于第三边),已知三边即可求面积
- 半周长简化:引入 \(p\) 使公式形式对称,减少计算复杂度
- 浮点精度控制:
printf的%.1f自动四舍五入到一位小数 - 适用于几何计算、数学公式实现类入门问题
【算法标签】
入门 #模拟
【代码详解】
#include <iostream> // 包含输入输出流库(Mac环境替代<bits/stdc++.h>)
#include <cmath> // 包含数学函数库(使用sqrt函数)
using namespace std; // 使用标准命名空间
/**
* 主函数 - 程序入口
* @return 程序执行状态码(0表示成功)
*/
int main()
{
double a, b, c; // 定义三角形三边长度
double p, ans, t; // 定义中间变量:半周长p,面积ans,临时变量t
cin >> a >> b >> c; // 输入三角形三条边长
p = 0.5 * (a + b + c); // 计算三角形半周长
t = p * (p - a) * (p - b) * (p - c); // 海伦公式中间计算
ans = sqrt(t); // 开平方得到最终面积
printf("%.1f", ans); // 格式化输出面积(保留1位小数)
return 0; // 返回程序执行成功状态码
}
【运行结果】
3 4 5
6.0
浙公网安备 33010602011771号