正在载入在线练习界面,本页内容可直接阅读…
AK CSP › CSP-J 2023 第一轮真题 › 第 17 题
CSP-J 2023 第一轮 第 17 题:程序(一):交换乘法顺序是否影响结果
题目
#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$ 的正整数,完成下面的判断题和单选题:
本小题
(2分)将第7行中的 (s-b)*(s-c) 改为 (s-c)*(s-b) 不会影响程序运行的结果( )
选项
- √. 正确
- ×. 错误
答案
√
题解
答案:√,正确。
这里要注意:C++ 的连乘按从左到右计算,所以修改前后分别相当于:
``cpp ((s * (s-a)) * (s-b)) * (s-c) ((s * (s-a)) * (s-c)) * (s-b) ``
浮点数运算改变顺序,一般可能产生舍入误差。但本题中,输入是不超过 \(1000\) 的正整数,s 和各个因子都是整数或半整数,能用二进制精确表示;数值范围也足够小,连乘的中间结果仍能由 double 精确表示。
因此,交换这两个因子的顺序不会改变根号内的值,最终输出不变。
真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1
京公网安备11010502062986号