正在载入在线练习界面,本页内容可直接阅读…

AK CSP › CSP-S 2021 第一轮真题 › 第16题

CSP-S 2021 第一轮 第16题:将第 21 行中t的类型声明从 int 改为 double,不会影响程序运行的结

阅读程序·判断 · 程序基本概念与数据类型 · 答案 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$ ,完成下面的判断题和单选题:

本小题

将第 21 行中 t 的类型声明从 int 改为 double, 不会 影响程序运行的结果。()

选项

  • T. 正确
  • F. 错误

答案

T

题解

答案:T(正确)。

关键是:t 的值能够被 int 和 double 精确表示,而且原程序中的除法已经是浮点除法。

  1. 计算 t 不会溢出,也不会损失精度。

每个输入的绝对值不超过 \(1000\),因此两数之差的绝对值不超过 \(2000\),有 \[ 0\le t\le 3\times2000^2=12\,000\,000. \] 这个范围内的整数,通常的 32 位 int 和 double 都能精确表示,所以修改类型后,t 的数值不变。

  1. 两个 if 的比较结果不变。

sq(d2 - d1)、sq(d2 + d1) 也是可精确表示的整数,改用 double 比较不会改变大小关系。

  1. 计算 x、y 时,本来就没有整数除法截断。

例如: ``cpp (sq(d1) - sq(d2) + t) / sqrt(t) / 2 ` sqrt(t) 返回 double,所以即使 t 是 int,除以 sqrt(t) 时也已经进行浮点除法,后面的 / 2` 同样是浮点除法。

因此,将 t 从 int 改成 double,不会改变程序输出。

真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1 京公网安备11010502062986号