【题目】
CSP-J 2023 入门级 第一轮 阅读程序(1)
#include <iostream>
#include <cmath>
using namespace std;
double f(double a, double b, double c) {
double s = (a + b + c) / 2;
return sqrt(s * (s - a) * (s - b) * (s - c));
}
int main() {
cout.flags(ios::fixed);
cout.precision(4);
int a, b, c;
cin >> a >> b >> c;
cout << f(a, b, c) << endl;
return 0;
}
假设输入的所有数都为不超过1000的正整数,完成下面的判断题和单选题:
判断题:
16. 当输入为"2 2 2"时,输出为"1.7321"( )
17. 将第7行中的"(s-b)*(s-c)“改为”(s-c)*(s-b)"不会影响程序运行的结果( )
18. 程序总是输出四位小数( )
单选题
19. 当输入为"3 4 5"时,输出为( )
A. “6.0000” B. “12.0000” C. “24.0000” D. “30.0000”
20. 当输入为"5 12 13"时,输出为( )
A. “24.0000” B. “30.0000” C. “60.0000” D. “120.0000”
【题目考点】
1. 数学
- 海伦公式
三角形三条边边长分别为:a, b, c
三角形半周长: p = ( a + b + c ) / 2 p = (a+b+c)/2 p=(a+b+c)/2
三角形面积: S = p ( p − a ) ( p − b ) ( p − c ) S = \sqrt{p(p-a)(p-b)(p-c)} S=p(p−a)(p−b)(p−c) - 勾股数
满足 a 2 + b 2 = c 2 a^2+b^2=c^2 a2+b2=c2的三个数字
常见的勾股数有:3 4 5, 6 8 10, 5 12 13…
【解题思路】
先看f函数
double f(double a, double b, double c) {
double s = (a + b + c) / 2;
return sqrt(s * (s - a) * (s - b) * (s - c));
}
很明显,a,b,c是三角形的三条边,s是半周长,f函数为使用海伦公式求三角形的面积。
int main() {
cout.flags(ios::fixed);
cout.precision(4);
int a, b, c;
cin >> a >> b >> c;
cout << f(a, b, c) << endl;
return 0;
}
主函数中前两句是用于设定浮点数输出格式,输出时固定保留4位小数,最后一位四舍五入,不足4位则补0。
而后输入三角形三条边长,输出三角形面积。
注意:虽然本题使用了海伦公式求三角形面积,但具体在做题时,我们可以通过自己熟悉的或更方便的方法求三角形面积。
判断题
16. 当输入为"2 2 2"时,输出为"1.7321"( )
答:T
边长为2的等边三角形,高为 2 2 − 1 2 = 3 \sqrt{2^2-1^2}=\sqrt{3} 22−12=3,面积为 S = 2 ∗ 3 / 2 = 3 S=2*\sqrt{3}/2=\sqrt{3} S=2∗3/2=3, 3 \sqrt{3} 3保留4位小数就是1.7321。
如果忘了 3 \sqrt{3} 3的值了,针对这个问题,可以求一下 1.7321 0 2 ≈ 3.0002 > 3 1.73210^2 \approx 3.0002> 3 1.732102≈3.0002>3, 1.7320 5 2 ≈ 2.999997 < 3 1.73205^2\approx 2.999997 < 3 1.732052≈2.999997<3,所以 1.73205 < 3 < 1.73210 1.73205 < \sqrt{3} < 1.73210 1.73205<3<1.73210,四舍五入到小数点后第四位,得到 3 ≈ 1.7321 \sqrt{3}\approx 1.7321 3≈1.7321。
- 将第7行中的"(s-b)*(s-c)“改为”(s-c)*(s-b)"不会影响程序运行的结果( )
答:T
乘法交换律,两个数字相乘,交换顺序结果不变。
- 程序总是输出四位小数( )
答:F
cout.flags(ios::fixed);cout.precision(4);
运行这两句后,设置了输出浮点数的格式为保留4位小数输出。
但是题目没有给定输入数据的范围,输入的三个数字可能会:两边之和小于等于第三边而无法构成三角形。如果 a + b < c a+b<c a+b<c,则 s = ( a + b + c ) / 2 < c s=(a+b+c)/2 < c s=(a+b+c)/2<c, s − c < 0 , s − a > 0 , s − b > 0 s-c<0,s-a>0,s-b>0 s−c<0,s−a>0,s−b>0,会导致 s ( s − a ) ( s − b ) ( s − c ) < 0 s(s-a)(s-b)(s-c)<0 s(s−a)(s−b)(s−c)<0,在使用海伦公式 s ( s − a ) ( s − b ) ( s − c ) \sqrt{s(s-a)(s-b)(s-c)} s(s−a)(s−b)(s−c)时无法对负数开根号,该程序如果运行,会输出nan。
单选题
19. 当输入为"3 4 5"时,输出为( )
A. “6.0000” B. “12.0000” C. “24.0000” D. “30.0000”
答:A
3 4 5是勾股数,边长为3 4 5的三角形是直角三角形,直角边为3 4,面积为: S = 3 ∗ 4 / 2 = 6 S=3*4/2=6 S=3∗4/2=6
- 当输入为"5 12 13"时,输出为( )
A. “24.0000” B. “30.0000” C. “60.0000” D. “120.0000”
答:B
5 12 13是勾股数,边长为5 12 13的三角形是直角三角形,直角边为5 12,面积为: S = 5 ∗ 12 / 2 = 30 S=5*12/2=30 S=5∗12/2=30
【答案】
- T
- T
- F
- A
- B