小E的射击训练习题 | 豆包MarsCode AI刷题

159 阅读3分钟

小E的射击训练习题笔记

问题描述

小E正在训练场进行射击练习,靶有10个环,靶心位于坐标(0, 0)。每个环对应不同的得分,具体规则如下:

  • 靶心内(半径为1)得10分。
  • 依次向外的每个环分数减少1分,即半径为2的环得9分,半径为3的环得8分,以此类推。
  • 如果射击点超出所有环(半径大于10),则得0分。

给定射击点的坐标(x, y),请计算小E的射击得分。

解题思路

  1. 计算距离

    • 首先,需要计算射击点到靶心的距离。由于靶心位于(0, 0),所以射击点(x, y)到靶心的距离可以通过公式 ( \text{distance} = \sqrt{x^2 + y^2} ) 计算得到。
  2. 确定得分

    • 根据计算得到的距离,确定射击点所在的环。每个环的半径分别为1, 2, 3, ..., 10。如果距离小于等于1,则得10分;如果距离小于等于2,则得9分;依此类推。如果距离大于10,则得0分。
  3. 实现细节

    • 使用 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;
}

代码解释

  1. 导入头文件

    #include <bits/stdc++.h>
    using namespace std;
    
    • 这行代码导入了常用的头文件,并使用了标准命名空间,方便后续代码编写。
  2. 主函数

    int main() {
        int x, y;
        cin >> x >> y;
    
    • 从标准输入读取射击点的坐标(x, y)。
  3. 计算距离

        double distance = sqrt(x * x + y * y);
    
    • 使用 sqrt 函数计算射击点到靶心的距离。
  4. 确定得分

        int score = max(0, 11 - static_cast<int>(distance));
    
    • 使用 max 函数确保得分不低于0。static_cast<int> 用于将距离转换为整数。
  5. 输出得分

        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))

代码解释

  1. 导入数学模块

    import math
    
    • 导入Python的数学模块,以便使用 math.sqrt 函数。
  2. 定义 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 用于将距离转换为整数。
  3. 主函数

    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

这些测试用例涵盖了各种情况,确保代码的正确性。