正在载入在线练习界面,本页内容可直接阅读…
AK CSP › CSP-S 2021 第一轮真题 › 第17题
CSP-S 2021 第一轮 第17题:将第26、27行中的“/sqrt(t)/2”替换为“/2/sqrt(t)”,不会
题目
#include <iostream>
#include <cmath>
using namespace std;
const double r = acos(0.5);
int a1, b1, c1, d1;
int a2, b2, c2, d2;
inline int sq(const int x) { return x * x; }
inline int cu(const int x) { return x * x * x; }
int main()
{
cout.flags(ios::fixed);
cout.precision(4);
cin >> a1 >> b1 >> c1 >> d1;
cin >> a2 >> b2 >> c2 >> d2;
int t = sq(a1 - a2) + sq(b1 - b2) + sq(c1 - c2);
if (t <= sq(d2 - d1)) cout << cu(min(d1, d2)) * r * 4;
else if (t >= sq(d2 + d1)) cout << 0;
else {
double x = d1 - (sq(d1) - sq(d2) + t) / sqrt(t) / 2;
double y = d2 - (sq(d2) - sq(d1) + t) / sqrt(t) / 2;
cout << (x * x * (3 * d1 - x) + y * y * (3 * d2 - y)) * r;
}
cout << endl;
return 0;
}
假设输入的所有数的绝对值都不超过 $1000$ ,完成下面的判断题和单选题:本小题
将第 26、27 行中的 / sqrt(t) / 2替换为/ 2 / sqrt(t),不会影响程序运行的结果。( )
选项
- T. 正确
- F. 错误
答案
F
题解
选 F,错误。 因为调整顺序后,会先进行整数除法,可能丢失小数部分。
令 A = sq(d1) - sq(d2) + t,它是 int 类型。除法从左往右计算:
- 原式
A / sqrt(t) / 2:sqrt(t)返回double,所以进行浮点除法。 - 改后
A / 2 / sqrt(t):先算A / 2,两个操作数都是整数,会截去小数部分,再进行浮点除法。
例如输入: ``text 0 0 0 1 1 0 0 1 ` 此时 t = 1,进入 else 分支,两行中的分子均为 1`:
- 原式:
x = y = 1 - 1.0 / 1 / 2 = 0.5。 - 改后:
x = y = 1 - (1 / 2) / 1.0 = 1。
因此,输出结果会改变。
真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1
京公网安备11010502062986号