《信息学奥赛一本通》第29题:计算线段长度
题目描述
已知线段的两个端点的坐标A(Xa,Ya)
,B(Xb,Yb)
,求线段 AB 的长度。
输入格式
输入共两行。
第一行是两个实数 X a , Y a Xa,Ya Xa,Ya,即 A A A 的坐标。
第二行是两个实数 X b , Y b Xb,Yb Xb,Yb,即 B B B 的坐标。
输入中所有实数的绝对值均不超过 10000 10000 10000。
输出格式
输出一个实数,即线段 A B AB AB 的长度,保留到小数点后 3 3 3 位。
输入输出样例 #1
输入 #1
1 1
2 2
输出 #1
1.414
大家好,我是莫小特。
这篇文章给大家带来《信息学奥赛一本通》中的第 29 题:计算线段长度。
一、题目描述
洛谷的题号是:B2030 计算线段长度
二、题意分析
这道题是信息学奥赛一本通练习题的第 29 题。
根据输入格式的描述,输入有两行,第一行是两个实数,表示 A 坐标,第二行也是两个实数,表示 B 坐标,题目中说明是实数,并且所有实数的绝对值不超过 10000,因此使用 double 类型。
double xa,ya;//A坐标
double xb,yb;//B坐标
cin>>xa>>ya;
cin>>xb>>yb;
输入完成后,来分析题目意思,根据题目意思,要输出 AB 线段的长度,根据样例给出的坐标,如下图,要求两个点之间的距离。
可以使用勾股定理来解决这个问题,即 a 2 + b 2 = c 2 a^2+b^2=c^2 a2+b2=c2
所以需要求出两个边的长度,再求出斜边的长度。
横向距离为 B 的横坐标减 A 的横坐标,纵向距离为 B 的纵坐标减去 A 的纵坐标。
所以可以写代码。
double AC=(xb-xa);
double BC=(yb-ya);
要求 AB 的长度,也就是 A C 2 + B C 2 = A B 2 AC^2+BC^2=AB^2 AC2+BC2=AB2
所以可以使用代码计算。
double AB=AC*AC+BC*BC;
AB 的长度因为是平方,所以需要开平方,用 #include<cmath>
头文件和 sqrt 函数。
double AB=sqrt(AB=AC*AC+BC*BC);
最后输出要保留小数点后 3 位,使用 printf() 函数。
printf("%.3lf",AB);
按样例输入来验证数据。
符合样例输出的格式,到网站提交测评。
测试通过!
三、完整代码
该题的完整代码如下:
#include<cmath>
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
double xa,ya;//A坐标
double xb,yb;//B坐标
cin>>xa>>ya;
cin>>xb>>yb;
double AC=(xb-xa);
double BC=(yb-ya);
double AB=sqrt(AB=AC*AC+BC*BC);
printf("%.3lf",AB);
return 0;
}
四、总结
这道题属于几何基础计算类型,考察的是二维平面上两点间的距离公式,题目虽然简单,却非常经典。
包含以下几个重要技巧:
技巧一:两点之间距离公式
利用勾股定理推导的公式:
A B = ( x b − x a ) 2 + ( y b − y a ) 2 AB=\sqrt(xb-xa)^2+(yb-ya)^2 AB=(xb−xa)2+(yb−ya)2
这是所有计算距离题的基本模版,不仅限于本题,在后续几何题、图形题中也经常使用。
技巧二:输入数据为实数,要使用 double 类型
输入数据为实数,使用 double 类型才能确保精度,并且坐标运算涉及乘法和开方,使用 double 更安全。
技巧三:结果保留小数位,推荐使用 printf
题目要求保留小数点后 3 位,使用 printf("%.3lf", val);
是最稳妥的方式,cout << fixed << setprecision(3)
也可实现,但需引入 。
技巧四:使用 sqrt() 进行开平方
不要手动实现平方根,直接用 里的 sqrt() 既简洁又高效,注意:一定要包含头文件 #include。
如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注我哦!
我们下集见~