洛谷 P1401:禁止在 int 乘 int 时不开 long long ← INT_MIN、INT_MAX、LLONG_MIN、LLONG_MAX
【题目来源】
【题目描述】
在比赛中,根据数据范围,分析清楚变量的取值范围,是非常重要的。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。
【算法代码】
【参考文献】

浙公网安备 33010602011771号