小E的射击训练习题笔记
问题描述
小E正在训练场进行射击练习,靶有10个环,靶心位于坐标(0, 0)。每个环对应不同的得分,具体规则如下:
- 靶心内(半径为1)得10分。
- 依次向外的每个环分数减少1分,即半径为2的环得9分,半径为3的环得8分,以此类推。
- 如果射击点超出所有环(半径大于10),则得0分。
给定射击点的坐标(x, y),请计算小E的射击得分。
解题思路
-
计算距离:
- 首先,需要计算射击点到靶心的距离。由于靶心位于(0, 0),所以射击点(x, y)到靶心的距离可以通过公式 ( \text{distance} = \sqrt{x^2 + y^2} ) 计算得到。
-
确定得分:
- 根据计算得到的距离,确定射击点所在的环。每个环的半径分别为1, 2, 3, ..., 10。如果距离小于等于1,则得10分;如果距离小于等于2,则得9分;依此类推。如果距离大于10,则得0分。
-
实现细节:
- 使用
sqrt函数计算距离。 - 使用
int类型强制转换,确保得分是一个整数。
- 使用
C++ 代码实现
#include <bits/stdc++.h>
using namespace std;
int main() {
int x, y;
cin >> x >> y;
// 计算射击点到靶心的距离
double distance = sqrt(x * x + y * y);
// 根据距离确定得分
int score = max(0, 11 - static_cast<int>(distance));
cout << score << endl;
return 0;
}
代码解释
-
导入头文件:
#include <bits/stdc++.h> using namespace std;- 这行代码导入了常用的头文件,并使用了标准命名空间,方便后续代码编写。
-
主函数:
int main() { int x, y; cin >> x >> y;- 从标准输入读取射击点的坐标(x, y)。
-
计算距离:
double distance = sqrt(x * x + y * y);- 使用
sqrt函数计算射击点到靶心的距离。
- 使用
-
确定得分:
int score = max(0, 11 - static_cast<int>(distance));- 使用
max函数确保得分不低于0。static_cast<int>用于将距离转换为整数。
- 使用
-
输出得分:
cout << score << endl; return 0; }- 输出计算得到的得分,并结束程序。
Python 代码实现
为了对比,下面是相同问题的Python代码实现:
import math
def solution(x: int, y: int) -> int:
# 计算射击点到靶心的距离
distance = math.sqrt(x * x + y * y)
# 根据距离确定得分
score = max(0, 11 - int(distance))
return score
if __name__ == '__main__':
x, y = map(int, input().split())
print(solution(x, y))
代码解释
-
导入数学模块:
import math- 导入Python的数学模块,以便使用
math.sqrt函数。
- 导入Python的数学模块,以便使用
-
定义
solution函数:def solution(x: int, y: int) -> int: # 计算射击点到靶心的距离 distance = math.sqrt(x * x + y * y) # 根据距离确定得分 score = max(0, 11 - int(distance)) return score- 计算射击点到靶心的距离。
- 使用
max函数确保得分不低于0。int用于将距离转换为整数。
-
主函数:
if __name__ == '__main__': x, y = map(int, input().split()) print(solution(x, y))- 从标准输入读取射击点的坐标(x, y)。
- 调用
solution函数计算得分并输出。
测试用例
为了验证代码的正确性,可以使用以下测试用例:
if __name__ == '__main__':
print(solution(1, 0) == 10) # 应该输出 True
print(solution(1, 1) == 9) # 应该输出 True
print(solution(0, 5) == 6) # 应该输出 True
print(solution(3, 4) == 6) # 应该输出 True
print(solution(11, 0) == 0) # 应该输出 True
这些测试用例涵盖了各种情况,确保代码的正确性。