题解:洛谷 P5735 距离函数
【题目来源】
【题目描述】
给出平面坐标上不在一条直线上三个点坐标 \((x_1,y_1),(x_2,y_2),(x_3,y_3)\),坐标值是实数,且绝对值不超过 \(100.00\),求围成的三角形周长。保留两位小数。
对于平面上的两个点 \((x_1,y_1),(x_2,y_2)\),则这两个点之间的距离\(dis =\sqrt {(x_2-x_1)^2+(y_2-y_1)^2}\)
【输入】
输入三行,第 \(i\) 行表示坐标 \((x_1,y_1)\),以一个空格隔开。
【输出】
输出一个两位小数,表示由这三个坐标围成的三角形的周长。
【输入样例】
0 0
0 3
4 0
【输出样例】
12.00
【核心思想】
-
问题分析:给定平面上三个点的坐标,且三点不共线,要求计算由这三个点构成的三角形的周长。根据距离公式分别计算三条边的长度,然后求和。这是一个基础几何计算问题,主要考查浮点数运算和函数定义。
-
算法选择:
- 直接计算:根据两点间距离公式 \(d = \sqrt{(x_2-x_1)^2 + (y_2-y_1)^2}\) 分别计算三边长度,然后求和。使用
sqrt函数进行开方运算,结果保留两位小数。
- 直接计算:根据两点间距离公式 \(d = \sqrt{(x_2-x_1)^2 + (y_2-y_1)^2}\) 分别计算三边长度,然后求和。使用
-
关键步骤:
- 读入:读取三个点的坐标
(x1,y1),(x2,y2),(x3,y3)。 - 计算三边长度:
dis12 = sqrt((x1-x2)^2 + (y1-y2)^2)dis23 = sqrt((x2-x3)^2 + (y2-y3)^2)dis31 = sqrt((x3-x1)^2 + (y3-y1)^2)
- 求和并输出:
perimeter = dis12 + dis23 + dis31,使用printf("%.2f", perimeter)输出保留两位小数。
- 读入:读取三个点的坐标
-
时间/空间复杂度:
- 时间复杂度:\(O(1)\),仅进行常数次浮点运算。
- 空间复杂度:\(O(1)\),仅使用常数个变量。
-
数学与函数封装:
- 距离函数:将距离计算封装为函数,提高代码可读性和复用性。
- 浮点数精度:坐标值为实数,使用
double类型保证精度,输出时保留两位小数。 - 适用场景:这种基础几何计算问题,是学习函数定义和浮点数处理的良好示例。
【算法标签】
入门 #模拟
【代码详解】
#include <bits/stdc++.h> // 包含标准库头文件(万能头文件)
using namespace std; // 使用标准命名空间
/**
* 计算两点之间的欧式距离
* @param x1 第一个点的x坐标
* @param y1 第一个点的y坐标
* @param x2 第二个点的x坐标
* @param y2 第二个点的y坐标
* @return 两点之间的距离
*/
double dis(double x1, double y1, double x2, double y2);
int main()
{
double x1, x2, x3, y1, y2, y3; // 定义变量:三个点的坐标
double ab, ac, bc; // 定义变量:存储三条边的长度
double ans; // 定义变量:存储三角形周长
// 输入三个点的坐标
cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
// 计算三条边的长度
ab = dis(x1, y1, x2, y2); // 边AB的长度
ac = dis(x1, y1, x3, y3); // 边AC的长度
bc = dis(x2, y2, x3, y3); // 边BC的长度
// 计算三角形周长
ans = ab + ac + bc;
// 输出结果,保留两位小数
printf("%.2f", ans);
return 0; // 程序正常结束
}
/**
* 计算两点之间的欧式距离
* @param x1 第一个点的x坐标
* @param y1 第一个点的y坐标
* @param x2 第二个点的x坐标
* @param y2 第二个点的y坐标
* @return 两点之间的距离
*/
double dis(double x1, double y1, double x2, double y2)
{
double ans; // 定义变量:存储距离计算结果
// 计算两点间距离的平方
ans = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
// 开平方得到实际距离
ans = sqrt(ans);
return ans; // 返回计算结果
}
【代码运行】
0 0
0 3
4 0
12.00
浙公网安备 33010602011771号