[语言月赛 202312] 禁止在 int 乘 int 时不开 long long 的题解
记住只在没有思路时使用题解,不要从它复制粘贴代码。请尊重题目和题解的作者。
在解题之前提交题解的代码会导致封禁。
在解题之前提交题解的代码会导致封禁。
作者:
概述
本题要求判断两个非负整数在其给定范围内相乘,结果是否可能超出 int 类型的表示范围。核心解法是利用单调性,只需检查最大值乘积是否超过 。
分析
核心观察
由于所有变量取值均为非负,乘积随每个变量的增大而单调不减,因此乘积最大值一定在各自取值范围的右端点取得。
思路
设 的取值范围为
,
的取值范围为
,且
,
。
乘积 的最大可能值即为
。只需判断该值是否大于
int 最大值 。若大于,则存在可能超过范围,需要使用
long long int;否则所有乘积均在 int 范围内,输出 int。
由于 和
最大可接近
,其乘积会达到
级别,超过
int 甚至 long long?但 long long 最大约 ,而
,在
long long 范围内,因此用 long long 存储乘积是安全的。
具体示例
样例 :
,
,乘积
,输出
int。
样例 :
,
,乘积
,输出
long long int。
算法步骤
- 读取四个整数
xl、xu、yl、yu。 - 计算最大可能乘积
max_prod = xu * yu(使用 64 位整数类型存储)。 - 若
max_prod > 2147483647,输出long long int,否则输出int。
复杂度分析
- 时间:
- 空间:
实现注意事项
- 虽然输入数值在
int范围内,但乘积可能超出int,因此读取和计算时需使用 64 位整数(C++ 中为long long,Python 中直接支持大整数)。 - 边界条件:当最大值恰好等于
时,仍在
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")
评论