洛谷 P1401:禁止在 int 乘 int 时不开 long long ← INT_MIN、INT_MAX、LLONG_MIN、LLONG_MAX

【题目来源】
https://www.luogu.com.cn/problem/P1401

【题目描述】
在比赛中,根据数据范围,分析清楚变量的取值范围,是非常重要的。int 类型变量与 int 类型变量相乘,往往可能超出 int 类型可以表示的取值范围。
现在,给出两个 int 类型变量 x,y 及其取值范围,请问 x×y 的值是否可能超过 int 类型可以表示的范围?
提示:int 类型可以表示的范围为 [−2147483648,2147483647],即 [−2^31, 2^31−1]。也就是,int 类型可以表示的最小值为 −2147483648,最大值为 2147483647。

【输入格式】
输入共两行。
输入的第一行为两个整数 xl, xu,表示变量 x 的取值范围为 xl≤x≤xu。
输入的第二行为两个整数 yl, yu,表示变量 y 的取值范围为 yl≤y≤yu。

【输出格式】
输出一行一个字符串:
若会超过,则输出 long long int;
若不会超过,则输出 int。​​​​​​​

【输入样例】
-2147483647 2147483647
-2147483647 2147483647

【输出样例】
long long int​​​​​​​

【数据范围】
对于 50% 的测试数据,0≤xl≤xu<2^31,0≤yl≤yu<2^31。
对于 100% 的测试数据,−2^31≤xl≤xu<2^31,−2^31≤yl≤yu<2^31。

【算法分析】
算法设计关键点:
(1)不能直接用 int 做乘法,会溢出未定义行为。故全部转 long long 计算。
(2)区间乘积的极值只出现在区间端点:xl*yl,xl*yu,xu*yl,xu*yu。只需检查这四个乘积。
(3)int 边界:INT_MIN = -2^31 = -2147483648,INT_MAX = 2^31-1 = 2147483647。
(4)long long 边界:LLONG_MIN = -2^63 = ‑9223372036854775808,LLONG_MAX = 2^63-1 = 9223372036854775807。

【算法代码】

#include <bits/stdc++.h>
using namespace std;

int main() {
    long long x1,x2,y1,y2;
    cin>>x1>>x2;
    cin>>y1>>y2;
    long long a=x1*y1,b=x1*y2,c=x2*y1,d=x2*y2;
    bool st=(a<INT_MIN || a>INT_MAX)
            || (b<INT_MIN || b>INT_MAX)
            || (c<INT_MIN || c>INT_MAX)
            || (d<INT_MIN || d>INT_MAX);

    if(st) cout<<"long long int\n";
    else cout<<"int\n";

    return 0;
}

/*
in:
-2147483647 2147483647
-2147483647 2147483647

out:
long long int
*/



【参考文献】
https://www.luogu.com.cn/problem/solution/P1401
 

posted @ 2026-09-06 18:02  Triwa  阅读(11)  评论(0)    收藏  举报