小E正在训练场进行射击练习,靶有10个环,靶心位于坐标(0, 0)。每个环对应不同的得分,靶心内(半径为1)得10分,依次向外的每个环分数减少1分。若射击点在某个半径为i的圆内,则得11-i分。如果射击点超出所有的环,则得0分。
根据给定的射击坐标(x, y),请计算小E的射击得分。
测试样例
样例1:
输入:
x = 1, y = 0
输出:10
样例2:
输入:
x = 1, y = 1
输出:9
样例3:
输入:
x = 0, y = 5
输出:6
样例4:
输入:
x = 3, y = 4
输出:6
这个问题要求我们根据给定的坐标计算小E在靶子上的得分。靶子是由10个同心圆组成的,每个圆对应不同的得分,得分与该点到靶心的距离有关。我们可以通过以下步骤来解决这个问题:
1. 计算距离
首先,我们需要计算给定坐标 (x, y) 到靶心 (0, 0) 的距离。可以使用欧几里得距离公式:
\text{距离} = \sqrt{x^2 + y^2}
2. 确定得分
根据距离确定得分:
- 如果距离小于等于1(靶心内),得分为10。
- 如果距离在(1, 2]之间,得分为9。
- 如果距离在(2, 3]之间,得分为8。
- 如果距离在(3, 4]之间,得分为7。
- 如果距离在(4, 5]之间,得分为6。
- 如果距离在(5, 6]之间,得分为5。
- 如果距离在(6, 7]之间,得分为4。
- 如果距离在(7, 8]之间,得分为3。
- 如果距离在(8, 9]之间,得分为2。
- 如果距离在(9, 10]之间,得分为1。
- 如果距离大于10,得分为0。
3. 逻辑推理
根据以上得分规则,我们可以推导出:
- 只需计算射击点到靶心的距离的平方,避免使用
sqrt函数来提高效率。 - 通过比较距离的平方与每个环的半径的平方,可以快速确定得分。
在代码实现中,我们可以采用以下步骤:
- 读取输入:获取用户输入的坐标 (x, y)。
- 计算距离的平方:计算 (d^2 = x^2 + y^2)。
- 确定得分:通过比较 (d^2) 和每个环的半径的平方来确定得分。
- 输出结果:输出最终得分。
4. 边界情况
在编写代码时,考虑到以下边界情况是很重要的:
- 靶心:当
(x, y)为(0, 0)时,得分应该为 10。 - 边缘情况:当
(x, y)的距离正好在某个得分的边界上,例如(1, 0)、(0, 1)、(2, 0)等,确保得分计算的正确性。 - 超出靶子:当
(x, y)的距离大于 10 时,得分应该为 0。
5. 输入处理
- 整数与浮点数:题目中的坐标可以是整数,但在实际应用中,考虑到小数点精度,可能需要处理浮点数输入。
- 输入范围:可以考虑对输入的范围进行限制,例如坐标值的最大值和最小值。
C++代码 #include #include using namespace std;
int solution(int x, int y) { double a = pow(x, 2); double b = pow(y, 2); double c = a + b; double d = sqrt(c); int e = (int)d; if (d - e != 0) { e += 1; } if(11-e<0) { e=11; } return 11-e; }
int main() { cout << (solution(1, 0) == 10) << endl; cout << (solution(1, 1) == 9) << endl; cout << (solution(0, 5) == 6) << endl; cout << (solution(3, 4) == 6) << endl; return 0; }