【发布时间】:2021-02-26 12:32:11
【问题描述】:
我正在解决 Leetcode 的这个问题,它要求反转数字,同时保持在 +/-2^31 范围内。我检查了针对这个问题的其他解决方案,并从那里创建了我自己的解决方案。它成功地适用于从 10 到小于 99,999,999 的数字。超出此范围(尝试提交代码以转到下一个问题时)会引发错误:
“第 17 行:字符 23:运行时错误:有符号整数溢出:445600005 * 10 无法在类型 'int' (solution.cpp) 中表示”
这是尝试提交代码时给出的输入:1534236469
我的代码
class Solution {
public:
int reverse(int x) {
int flag = 0;
int rev = 0;
if (x >= pow(2, 31)) {
return 0;
} else {
if (x < 0) {
flag = 1;
x = abs(x);
}
while(x > 0) {
rev = rev * 10 + x % 10;
x /= 10;
}
if (flag == 1) {
rev = rev*(-1);
}
return rev;
}
}
};
从我的代码中可以看出,我添加了一个 if 语句,如果数字大于 2^31,则基本上返回 0。不幸的是,这是错误的。
谁能解释一下如何解决这个问题?提前谢谢你。
【问题讨论】:
-
如果您将整数保存为字符串(十进制),则反转整数非常容易。
-
任何只使用整数值的
pow,尤其是2 的整数幂,都是自动错误的。这不是pow的用途,这类问题只是基础数学的练习题。不幸的是,像“Leetcode”这样的网站不是 C++ 教程网站,在教授 C++ 基础知识方面几乎没有价值。这不是这些网站的用途。它们只是随机编码难题的列表,要真正学习如何在 C++ 中完成这些事情,需要a good C++ textbook。 -
反转 1534236469 会使您超出该范围。你应该检查你的结果,而不是输入。 (并且限制是整数
1 << 31,而不是浮点数pow(2,31)。) -
我不明白我到处都知道使用 pow 可以将数字的幂提高到你想要的程度??
-
@Thanos 因为它们都转换为浮点数en.cppreference.com/w/cpp/numeric/math/pow 现在你在那个美妙的地方,如果一个特定的浮点表示可以精确地保持整数值,你必须锻炼。最好不要问这个问题。