【发布时间】:2021-10-01 22:27:51
【问题描述】:
在 Codeforces 和 Codechef 中的许多编码流和解决方案中,我看到当数字有点大并且我们需要将其分配给 int 时,我们将其转换为 long 而不是将其转换为 int
int maxAreaOfCake(int h, int w, vector<int>& hCuts, vector<int>& vCuts)
{
hCuts.push_back(0);
hCuts.push_back(h);
vCuts.push_back(0);
vCuts.push_back(w);
int MOD = 100000007;
sort(hCuts.begin(), hCuts.end());
sort(vCuts.begin(), vCuts.end());
int horizontal = 0;
for(int i = 0; i < (int)hCuts.size() - 1; i++) horizontal = max(horizontal, hCuts[i+1] - hCuts[i]);
int vertical = 0;
for(int i = 0; i < (int)vCuts.size() - 1; i++) vertical = max(vertical, vCuts[i+1] - vCuts[i]);
return (int) ((long)horizontal%MOD * (long)vertical%MOD)%MOD;
}
这是leetcode中MaxAreaOfCake问题的解法。在这里,由于返回类型是 int,我们最终将转换为 int,但在此之前,我们首先将其转换为 long。当我尝试将 long 更改为 int 时,出现运行时错误。如果有人知道答案,请分享:)
【问题讨论】:
-
“有点大”是什么意思?
-
y的类型是什么?这个演员表可能什么也没做。 -
竞争性编程是它自己的事情,不应该绝对用作如何做好编程的指南。 “竞争性编程”使用的做法在真正的实用代码中非常糟糕。
-
大概
MOD可以大于46340,在这种情况下MOD*MOD可以溢出int。所以计算以long完成。但最终结果是模MOD,它可能再次适合int。 -
在此代码中使用
long仅在sizeof(long) > sizeof(int)时才有意义,并非每个编译器都能保证。
标签: c++ casting multiplication integer-overflow