2021年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第1题)

第1题
cpp
01 #include <iostream>
02 #include <cmath>
03 using namespace std;
04
05 const double r = acos(0.5);
06
07 int a1, b1, c1, d1;
08 int a2, b2, c2, d2;
09
10 inline int sq(const int x) { return x * x; }
11 inline int cu(const int x) { return x * x * x; }
12
13 int main()
14 {
15 cout.flags(iostream::fixed);
16 cout.precision(4);
17
18 cin >> a1 >> b1 >> c1 >> d1;
19 cin >> a2 >> b2 >> c2 >> d2;
20
21 int t = sq(a1 - a2) + sq(b1 - b2) + sq(c1 - c2);
22
23 if (t <= sq(d2 - d1)) cout << cu(min(d1, d2)) * r * 4;
24 else if (t >= sq(d2 + d1)) cout << 0;
25 else {
26 double x = d1 - (sq(d1) - sq(d2) + t) / sqrt(t) / 2;
27 double y = d2 - (sq(d2) - sq(d1) + t) / sqrt(t) / 2;
28 cout << (x * x * (3 * d1 - x) + y * y * (3 * d2 - y)) * r;
29 }
30 cout << endl;
31 return 0;
32 }
假设输入的所有数的绝对值都不超过 10001000 ,完成下面的判断题和单选题:
判断题
-
将第 21 行中
t的类型声明从int改为double, 不会 影响程序运行的结果。()A. 正确 B. 错误
-
将第 26、27 行中的
/ sqrt(t) / 2替换为/ 2 / sqrt(t),不会影响程序运行的结果。( )A. 正确 B. 错误
-
将第 28 行中的
x * x改成sq(x)、y * y改成sq(y),不会影响程序运行的结果。( )A. 正确 B. 错误
-
(2 分) 当输入为
0 0 0 1 1 0 0 1时,输出为1.3090( )A. 正确 B. 错误
单选题
- 当输入为
1 1 1 1 1 1 1 2时,输出为( )。
A.3.1416
B.6.2832
C.4.7124
D.4.1888 - (2.5 分)这段代码的含义为( )。
A. 求圆的面积并
B. 求球的体积并
C. 求球的体积交
D. 求椭球的体积并
代码分析
-
常量
r = acos(0.5) = π/3,配合后续乘以4或乘以(x²(3d₁-x)+y²(3d₂-y))用于计算球体积或球缺体积。 -
sq,cu分别计算平方、立方(参数为整数)。 -
输入四个整数表示第一个球的球心坐标
(a₁,b₁,c₁)和半径d₁,后四个为第二个球。 -
t为两球心距离平方。 -
分支逻辑:
-
t ≤ (d₂-d₁)²:内含或内切,交体积 = 小球的体积,即(4/3)π·min(d₁,d₂)³,对应cu(min(d₁,d₂)) * r * 4。 -
t ≥ (d₂+d₁)²:相离或外切,交体积 = 0。 -
否则:相交,计算两球冠高度:
cppdouble x = d1 - (d1*d1 - d2*d2 + t) / sqrt(t) / 2; // 球冠高度 h₁ double y = d2 - (d2*d2 - d1*d1 + t) / sqrt(t) / 2; // 球冠高度 h₂交体积 = 两球缺体积之和 =
(π/3)·[h₁²(3d₁-h₁) + h₂²(3d₂-h₂)],对应输出(x*x*(3*d1-x)+y*y*(3*d2-y)) * r。
-
-
结论 :程序计算两个球的交集体积。
判断题答案及解析
-
t的值来自整数的平方和,在int范围内(输入绝对值 ≤ 10001000,平方和 ≤ 3×(20002000)² ≈ 1.2×10¹⁴,仍可由double精确表示)。后续sqrt(t)等操作均使用浮点数,转换不会损失精度,程序行为不变。正确 -
26、27行中的小括号部分运算结果是整数,先除以sqrt部分为纯浮点除法,如果改为先除以2,包含整数除法截断,结果不同。错误
-
sq函数参数为const int,传入double型x会隐式转换为int,导致小数部分被截断,平方结果错误,从而改变交体积计算值。错误 -
两球半径均为 1,球心距 = 1。相交部分体积公式:
V = π(4R+d)(2R-d)²/12,代入得5π/12 ≈ 1.308996,保留四位小数为1.3090。程序输出一致。正确
单选题解析
-
球心重合,半径 1 的球完全包含在半径 2 的球内,交体积 = 小球体积 =
(4/3)π·1³ ≈ 4.18879,输出4.1888,选 D。 -
根据上述分析,程序根据球心距与半径关系分三种情况计算两球重叠部分的体积,即球的体积交 ,选 C。
专栏推荐:信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新)
https://blog.csdn.net/weixin_66461496/category_13125089.html
各种学习资料,助力大家一站式学习和提升!!!
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<"########## 一站式掌握信奥赛知识! ##########";
cout<<"############# 冲刺信奥赛拿奖! #############";
cout<<"###### 课程购买后永久学习,不受限制! ######";
return 0;
}
1、csp信奥赛高频考点知识详解及案例实践:
CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转
CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转
信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html
2、csp信奥赛冲刺一等奖有效刷题题解:
CSP信奥赛C++初赛及复赛高频考点真题解析(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转
CSP信奥赛C++一等奖通关刷题题单及题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转
信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新)
https://blog.csdn.net/weixin_66461496/category_13125089.html
3、GESP C++考级真题题解:

GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转

GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转

GESP(C++ 七级+八级)真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13117178.html
4、CSP信奥赛C++竞赛拿奖视频课:
https://edu.csdn.net/course/detail/40437 点击跳转

· 文末祝福 ·
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<"跟着王老师一起学习信奥赛C++";
cout<<" 成就更好的自己! ";
cout<<" csp信奥赛一等奖属于你! ";
return 0;
}