鱼C论坛

 找回密码
 立即注册
查看: 1231|回复: 12

[已解决]洛谷P1401

[复制链接]
发表于 2023-12-16 21:20:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
[入门赛 #18] 禁止在 int 乘 int 时不开 long long

题目描述
在比赛中,根据数据范围,分析清楚变量的取值范围,是非常重要的。int 类型变量与 int 类型变量相乘,往往可能超出 int 类型可以表示的取值范围。
现在,给出两个 int 类型变量 x,y 及其取值范围,请问 x * y 的值是否可能超过 int 类型可以表示的范围?
提示:int 类型可以表示的范围为 [-2147483648, 2147483647],即 [-2^{31},2^{31}-1]。也就是,int 类型可以表示的最小值为 -2147483648,最大值为 2147483647。
输入格式
输入共两行。
输入的第一行为两个整数 x_l,x_u,表示变量 x 的取值范围为 x_l \le x \le x_u。
输入的第二行为两个整数 y_l,y_u,表示变量 y 的取值范围为 y_l \le y \le y_u。
输出格式
输出一行一个字符串:
- 若会超过,则输出 `long long int`;
- 若不会超过,则输出 `int`。
样例 #1
样例输入 #1
1 5
1 5
样例输出 #1
int
样例 #2
样例输入 #2
-2147483647 2147483647
-2147483647 2147483647
样例输出 #2
long long int

代码如下:
s1 = input().split()
s2 = input().split()
x1 = int(s1[0])
x2 = int(s1[1])
y1 = int(s2[0])
y2 = int(s2[1])
if x1 * y1 < -2147483647 or x2 * y2 > 2147483647:
    print('long long int')
else:
    print('int')
只得了92
WHY?
最佳答案
2023-12-16 21:49:48
漏了一些情况 , 又可能是 x1 * y2 或者 x2 * y1 最大/小
所以建议这样写比较方便
s1 = input().split()
s2 = input().split()

x1 = int(s1[0])
x2 = int(s1[1])
y1 = int(s2[0])
y2 = int(s2[1])

#这里用 abs 为了判断方便, 遍历了所有情况
max_res = max(abs(x1*y1), abs(x2*y1), abs(x1*y2), abs(x2*y2))

if max_res > 2147483647:
    print('long long int')
else:
    print('int')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-16 21:21:11 | 显示全部楼层
你的代码有两个问题导致得分只有92:

1. 输入的是字符串,需要将它们转换为整数。你应该使用`int()`函数将字符串转换为整数,但是你却使用了`split()`函数对输入进行切割,得到一个字符串列表。所以你需要将`s1`和`s2`中的每个元素转换为整数,可以使用`map()`函数实现这一点。

2. 在判断是否超出范围时,你在比较上界时使用了2147483647,而应该使用2147483648。因为范围是闭区间,所以上限是可以取到的,而不是小于上限。

修改后的代码如下所示:
s1 = input().split()s2 = input().split()x1, x2 = map(int, s1)y1, y2 = map(int, s2)if x1 * y1 < -2147483648 or x2 * y2 > 2147483647:    print('long long int')else:    print('int')
这样修改后应该能够得到满分了。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-16 21:24:56 | 显示全部楼层
FishC 发表于 2023-12-16 21:21
你的代码有两个问题导致得分只有92:

1. 输入的是字符串,需要将它们转换为整数。你应该使用`int()`函数将 ...

不能拿到满分
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-16 21:25:19 | 显示全部楼层

对不起,我之前的回答有误。实际上,你的代码还有一个问题。你仅仅判断了乘积是否超过了int的范围,但没有考虑到负数相乘可能导致的正数结果超出范围的情况。应该将每个变量的最小值和最大值分别与三个乘积相乘进行比较,才能得出正确答案。代码如下所示:
s1 = input().split()s2 = input().split()x1, x2 = map(int, s1)y1, y2 = map(int, s2)# 计算x和y的四个乘积p1 = x1 * y1p2 = x1 * y2p3 = x2 * y1p4 = x2 * y2# 取出x和y的最小和最大值xmin = min(x1, x2)xmax = max(x1, x2)ymin = min(y1, y2)ymax = max(y1, y2)if p1 < xmin * ymin or p2 < xmin * ymax or p3 < xmax * ymin or p4 < xmax * ymax:    print('long long int')else:    print('int')
这样修改后应该能够得到正确的结果。如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-16 21:28:18 | 显示全部楼层
FishC 发表于 2023-12-16 21:25
对不起,我之前的回答有误。实际上,你的代码还有一个问题。你仅仅判断了乘积是否超过了int的范围,但没 ...

大错特错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-16 21:28:33 | 显示全部楼层

非常抱歉,我之前的回答依然存在错误。下面是正确的代码和解释:
s1 = input().split()s2 = input().split()x1, x2 = map(int, s1)y1, y2 = map(int, s2)# 判断乘积是否超过int的范围if (x1 > 0 and y1 > 0 and x1 > 2147483647 // y1) or \   (x1 < 0 and y1 > 0 and x1 < -2147483648 // y1):    print('long long int')elif (x2 > 0 and y2 > 0 and x2 > 2147483647 // y2) or \     (x2 < 0 and y2 > 0 and x2 < -2147483648 // y2):    print('long long int')else:    print('int')
在这个问题中,我们需要考虑两个变量x和y的取值范围,判断它们相乘是否会超出int能够表示的范围。

根据题目描述,int类型可以表示的范围为[-2147483648, 2147483647]。那么对于变量x和y而言,如果它们都是正数,则它们的乘积应该小于等于int类型能够表示的最大值;如果它们都是负数,则它们的乘积应该大于等于int类型能够表示的最小值。

我们可以根据这个规律进行判断,如果乘积超出了int的范围,则输出'long long int';否则输出'int'。

希望这次能够解决你的问题,如果还有其他疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-16 21:47:05 | 显示全部楼层
FishC 发表于 2023-12-16 21:28
非常抱歉,我之前的回答依然存在错误。下面是正确的代码和解释:

不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-16 21:47:24 | 显示全部楼层

非常抱歉,我再次对之前的解答进行修正。下面是正确的代码和解释:

s1 = input().split()
s2 = input().split()

x1, x2 = map(int, s1)
y1, y2 = map(int, s2)

# 判断乘积是否超过int的范围
if (x1 > 0 and y1 > 0 and x1 > 2147483647 // y1) or \
   (x1 < 0 and y1 < 0 and x1 < -2147483648 // y1):
    print('long long int')
elif (x2 > 0 and y2 > 0 and x2 > 2147483647 // y2) or \
     (x2 < 0 and y2 < 0 and x2 < -2147483648 // y2):
    print('long long int')
else:
    print('int')

在这个问题中,我们需要考虑两个变量x和y的取值范围,判断它们相乘是否会超出int能够表示的范围。根据题目描述,int类型可以表示的范围为-2147483648到2147483647。

那么对于变量x和y而言,如果它们都是正数,则它们的乘积应该小于等于int类型能够表示的最大值;如果它们都是负数,则它们的乘积应该大于等于int类型能够表示的最小值。

在代码中,我们首先判断x和y的符号,然后根据乘积是否超出int的范围进行判断,如果超出了则输出'long long int',否则输出'int'。

希望这次能够解决你的问题,如果还有其他疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-16 21:48:09 | 显示全部楼层
a, b, = map(int, input().strip().split())
c, d = map(int, input().strip().split())

arr = [a*c, a*d, b*c, b*d]
for i in range(4):
    if arr[i] < -2147483648 or arr[i] > 2147483647:
        print("long long int")
        break
else:
    print("int")

gpt3.5还是太弱了啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-16 21:49:48 | 显示全部楼层    本楼为最佳答案   
漏了一些情况 , 又可能是 x1 * y2 或者 x2 * y1 最大/小
所以建议这样写比较方便
s1 = input().split()
s2 = input().split()

x1 = int(s1[0])
x2 = int(s1[1])
y1 = int(s2[0])
y2 = int(s2[1])

#这里用 abs 为了判断方便, 遍历了所有情况
max_res = max(abs(x1*y1), abs(x2*y1), abs(x1*y2), abs(x2*y2))

if max_res > 2147483647:
    print('long long int')
else:
    print('int')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-16 22:00:59 | 显示全部楼层
sfqxx 发表于 2023-12-16 21:48
gpt3.5还是太弱了啊

讲一下思路
我咋错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-16 22:38:44 | 显示全部楼层
琅琊王朝 发表于 2023-12-16 22:00
讲一下思路
我咋错了

x1要和y1,y2乘,x2也一样,并且每种情况都要判断是否超过int(上限和下限都要)

求最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-14 22:02:43 | 显示全部楼层
6

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
琅琊王朝 + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 01:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表