问题分析
小E进行射击练习的靶子有10个环,靶心位于坐标原点(0, 0)。射击点在不同的环内会获得不同的分数,具体如下:
- 半径为 1 的圆(靶心):得 10 分
- 半径为 2 的圆:得 9 分
- 半径为 3 的圆:得 8 分
- ...
- 半径为 10 的圆:得 1 分
- 如果射击点超出了所有的环(即超出了半径为 10 的圆),得 0 分
问题转化
给定射击点的坐标 (x, y),我们需要根据该点与原点之间的距离来判断该点所在的环,并计算得分。射击点的得分是根据距离原点的距离来决定的。
具体而言:
-
计算点
(x, y)到原点(0, 0)的欧几里得距离:distance = sqrt(x^2 + y^2)。 -
根据
distance的值确定其所处的环:- 如果
distance小于等于 1,则得 10 分; - 如果
distance小于等于 2,则得 9 分; - 如果
distance小于等于 3,则得 8 分; - 以此类推,直到
distance小于等于 10 得 1 分; - 如果
distance大于 10,则得 0 分。
- 如果
思路与步骤
-
计算距离: 使用公式
distance = sqrt(x^2 + y^2)计算射击点(x, y)到原点的距离。 -
判断得分:
- 通过对
distance的大小进行判断,确定射击点所处的环。 - 可以通过逐层比较
distance是否小于或等于对应的半径值来确定得分。
- 通过对
-
优化: 由于在计算距离时,平方根并不影响最终的比较,因此我们可以避免使用
sqrt,直接使用distance^2进行比较。这样我们只需计算x^2 + y^2,提高效率。
示例
示例 1:
输入:
Copy Code
3 4
计算:
distance_squared = 3^2 + 4^2 = 9 + 16 = 25- 由于
25 <= 36,因此得分为 5 分。
输出:
Copy Code
5
示例 2:
输入:
Copy Code
6 8
计算:
distance_squared = 6^2 + 8^2 = 36 + 64 = 100- 由于
100 <= 100,因此得分为 1 分。
输出:
Copy Code
1
示例 3:
输入:
Copy Code
0 0
计算:
distance_squared = 0^2 + 0^2 = 0- 由于
0 <= 1,因此得分为 10 分。
输出:
Copy Code
10
时间复杂度与空间复杂度
- 时间复杂度:
O(1)。因为无论输入的坐标是什么,我们只需要进行常数次的计算和判断。 - 空间复杂度:
O(1)。我们只需要常量空间来存储输入值和计算结果。
总结
通过计算射击点 (x, y) 到原点的距离的平方并根据其大小判断得分,我们可以高效地解决这个问题。此方法避免了使用浮点数计算,提高了程序的效率,并且通过简单的条件判断直接得出结果。