[语言月赛 202312] 禁止在 int 乘 int 时不开 long long 的题解


记住只在没有思路时使用题解,不要从它复制粘贴代码。请尊重题目和题解的作者。
在解题之前提交题解的代码会导致封禁。

作者: admin

概述

本题要求判断两个非负整数在其给定范围内相乘,结果是否可能超出 int 类型的表示范围。核心解法是利用单调性,只需检查最大值乘积是否超过 2147483647。

分析
核心观察

由于所有变量取值均为非负,乘积随每个变量的增大而单调不减,因此乘积最大值一定在各自取值范围的右端点取得。

思路

设 x 的取值范围为 [x_l, x_u],y 的取值范围为 [y_l, y_u],且 0 \le x_l \le x_u < 2^{31},0 \le y_l \le y_u < 2^{31}。
乘积 x \times y 的最大可能值即为 x_u \times y_u。只需判断该值是否大于 int 最大值 2147483647。若大于,则存在可能超过范围,需要使用 long long int;否则所有乘积均在 int 范围内,输出 int。

由于 x_u 和 y_u 最大可接近 2^{31}-1,其乘积会达到 2^{62} 级别,超过 int 甚至 long long?但 long long 最大约 9.22e18,而 (2^{31})^2 \approx 4.61e18,在 long long 范围内,因此用 long long 存储乘积是安全的。

具体示例

样例 1:x_u = 5,y_u = 5,乘积 25 \le 2147483647,输出 int。
样例 2:x_u = 2147483647,y_u = 2147483647,乘积 (2^{31}-1)^2 \approx 4.61e18 > 2147483647,输出 long long int。

算法步骤
  1. 读取四个整数 xl、xu、yl、yu。
  2. 计算最大可能乘积 max_prod = xu * yu(使用 64 位整数类型存储)。
  3. 若 max_prod > 2147483647,输出 long long int,否则输出 int。
复杂度分析
  • 时间:O(1)
  • 空间:O(1)
实现注意事项
  • 虽然输入数值在 int 范围内,但乘积可能超出 int,因此读取和计算时需使用 64 位整数(C++ 中为 long long,Python 中直接支持大整数)。
  • 边界条件:当最大值恰好等于 2147483647 时,仍在 int 范围内,不应输出 long long int。
  • 输出字符串必须与题目要求完全一致(注意大小写和空格)。
源代码
#include <iostream>
#include <climits>
using namespace std;

int main() {
    long long xl, xu, yl, yu;
    cin >> xl >> xu >> yl >> yu;

    long long max_prod = xu * yu;
    if (max_prod > INT_MAX) {
        cout << "long long int" << endl;
    } else {
        cout << "int" << endl;
    }
    return 0;
}
xl, xu = map(int, input().split())
yl, yu = map(int, input().split())

max_prod = xu * yu
if max_prod > 2147483647:
    print("long long int")
else:
    print("int")

评论

目前没有评论。