老题新解|计算线段长度

发布于:2025-07-19 ⋅ 阅读:(19) ⋅ 点赞:(0)

《信息学奥赛一本通》第29题:计算线段长度

题目描述
已知线段的两个端点的坐标 A(Xa,Ya)B(Xb,Yb) ,求线段 AB 的长度。
输入格式
输入共两行。
第一行是两个实数 X a , Y a Xa,Ya XaYa,即 A A A 的坐标。
第二行是两个实数 X b , Y b Xb,Yb XbYb,即 B B B 的坐标。
输入中所有实数的绝对值均不超过 10000 10000 10000
输出格式
输出一个实数,即线段 A B AB AB 的长度,保留到小数点后 3 3 3 位。
输入输出样例 #1
输入 #1
1 1
2 2
输出 #1
1.414

大家好,我是莫小特。
这篇文章给大家带来《信息学奥赛一本通》中的第 29 题:计算线段长度。

image.png

一、题目描述

洛谷的题号是:B2030 计算线段长度

image.png

二、题意分析

这道题是信息学奥赛一本通练习题的第 29 题。

根据输入格式的描述,输入有两行,第一行是两个实数,表示 A 坐标,第二行也是两个实数,表示 B 坐标,题目中说明是实数,并且所有实数的绝对值不超过 10000,因此使用 double 类型。

double xa,ya;//A坐标
double xb,yb;//B坐标
cin>>xa>>ya;
cin>>xb>>yb;

输入完成后,来分析题目意思,根据题目意思,要输出 AB 线段的长度,根据样例给出的坐标,如下图,要求两个点之间的距离。

image.png

可以使用勾股定理来解决这个问题,即 a 2 + b 2 = c 2 a^2+b^2=c^2 a2+b2=c2

image.png

所以需要求出两个边的长度,再求出斜边的长度。

横向距离为 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);

按样例输入来验证数据。

image.png

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

image.png

测试通过!

三、完整代码

该题的完整代码如下:

#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=( xbxa)2+(ybya)2

这是所有计算距离题的基本模版,不仅限于本题,在后续几何题、图形题中也经常使用。

技巧二:输入数据为实数,要使用 double 类型

输入数据为实数,使用 double 类型才能确保精度,并且坐标运算涉及乘法和开方,使用 double 更安全。

技巧三:结果保留小数位,推荐使用 printf

题目要求保留小数点后 3 位,使用 printf("%.3lf", val); 是最稳妥的方式,cout << fixed << setprecision(3) 也可实现,但需引入 。

技巧四:使用 sqrt() 进行开平方

不要手动实现平方根,直接用 里的 sqrt() 既简洁又高效,注意:一定要包含头文件 #include。

---end---

如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注我哦!

我们下集见~


网站公告

今日签到

点亮在社区的每一天
去签到