
本文详解 uri online judge 第 1015 题「两点间距离」的标准解法:从读取标准输入、解析坐标、应用欧氏距离公式,到精确格式化输出(4 位小数),并指出常见错误(如硬编码、i/o 混杂、命名不规范)及优化实践。
本文详解 uri online judge 第 1015 题「两点间距离」的标准解法:从读取标准输入、解析坐标、应用欧氏距离公式,到精确格式化输出(4 位小数),并指出常见错误(如硬编码、i/o 混杂、命名不规范)及优化实践。
URI 1015 是一道经典的计算几何入门题,核心是实现二维平面上两点间的欧氏距离公式:
[
\text{Distance} = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2}
]
但关键不在于公式本身,而在于严格遵循输入/输出规范与编写可被在线评测系统(OJ)正确执行的代码。
✅ 正确实现要点
禁止硬编码输入
初学者常直接赋值 x1 = 1.0; y1 = 7.0; ... —— 这会导致 85% 以上测试用例失败。OJ 会通过标准输入(stdin)动态提供多组测试数据,程序必须主动读取。-
正确读取并解析输入
在 Node.js 环境中(URI 使用此环境),需使用 fs.readFileSync('/dev/stdin', 'utf8') 读取全部输入内容,再按空格或换行分割、转换为数字:const input = require('fs').readFileSync('/dev/stdin', 'utf8'); const [x1, y1, x2, y2] = input.trim().split(/\s+/).map(Number);⚠️ 注意:.trim() 可避免末尾换行符导致空字符串解析失败;正则 /\s+/ 能同时处理空格、制表符和换行符,鲁棒性更强。
-
函数设计应职责单一
原代码将 console.log 写入函数内部,违反“计算与 I/O 分离”原则。推荐函数仅负责计算并返回数值,格式化与输出由主流程处理:const distance = (x1, y1, x2, y2) => Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2); // 或更简洁(利用幂运算符) // const distance = (x1, y1, x2, y2) => ((x2 - x1) ** 2 + (y2 - y1) ** 2) ** 0.5;
-
严格按要求格式化输出
输出必须保留且恰好 4 位小数,使用 .toFixed(4)。注意该方法返回字符串,且会自动四舍五入(符合题目要求):console.log(distance(x1, y1, x2, y2).toFixed(4));
? 完整可提交代码(推荐版本)
const input = require('fs').readFileSync('/dev/stdin', 'utf8');
const [x1, y1, x2, y2] = input.trim().split(/\s+/).map(Number);
const distance = (x1, y1, x2, y2) =>
Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);
console.log(distance(x1, y1, x2, y2).toFixed(4));? 验证示例
- 输入:
1.0 7.0 5.0 9.0
- 计算:
((5.0 - 1.0)^2 + (9.0 - 7.0)^2 = 16 + 4 = 20) → (\sqrt{20} \approx 4.4721359...) → 4.4721 ✔️
⚠️ 常见错误总结
- ❌ 使用 prompt() / readline(URI 不支持浏览器 API 或交互式输入)
- ❌ 忽略输入中的换行符,未用 .trim() 导致 NaN
- ❌ 函数参数顺序混乱(如误传 x2, x1, y2, y1 但公式仍按 (x1,y1)→(x2,y2) 计算)
- ❌ 命名不符合 JavaScript 社区惯例(如 Distance 应为 distance)
掌握输入解析、纯函数抽象与精准格式化,是攻克 URI 基础题型的关键能力。此模式同样适用于 URI 1013、1018、1036 等同类数值计算题。










