当前位置: 首页 > 知识库问答 >
问题:

为什么反向操作允许溢出处理?

益思博
2023-03-14

leetcode问题(https://leetcode.com/problems/reverse-integer/description/)请求反转一个整数,这很简单,但是如果有溢出,希望用户返回0。使用long也很简单,因为您可以检查它是否大于整数。java中的MAX_INT或MIN_INT。但如果只允许32位整数,如何实现这一点?

显示了以下解决方案:

public int reverse(int x)
{
    int result = 0;

    while (x != 0)
    {
        int tail = x % 10;
        int newResult = result * 10 + tail;
        if ((newResult - tail) / 10 != result)
        { return 0; }
        result = newResult;
        x = x / 10;
    }

    return result;
}

我不明白为什么会这样。为什么“反转”操作并将其与之前的结果进行比较成功地检查溢出?

如果你从x开始,然后说:x2=(x*10)b,(x2-b)/10不总是等于x吗?因为正溢出总是循环到最小值,而负溢出总是循环到最大值。如何检查溢出?我希望能澄清这一点。

共有1个答案

方河
2023-03-14

如果你从x开始,然后说:x2=(x*10)b,(x2-b)/10不总是等于x吗?

不。你关于“循环”的直觉对于加法和减法是正确的——就像12点左右在钟面上来回移动一样。

但是,这不适用于乘法,如本例所示:

int x = 2_000_000_000;
int y = x * 10;
int z = y / 10;

System.out.println(x);   // 2000000000
System.out.println(z);   // -147483648

现场演示。

所以要回答最重要的问题:

为什么“逆转”操作,并将其与之前的结果进行比较,就能成功检查溢出?

因为当溢出发生时,“反转”这个操作序列不会让你回到输入值。

 类似资料:
  • 问题是:整数的倒数。 示例1:x=123,返回321 例2:x=-123,返回-321 你注意到反整数可能会溢出吗?假设输入是32位整数,则100000003溢出的相反值。你应该如何处理此类案件? 抛出异常?很好,但是如果抛出异常不是一个选项呢?然后必须重新设计函数(即,添加一个额外的参数)。 从我搜索的网站的解决方案是: 但是,当时,控制台会打印,而不是。因此,如果我们不能使用异常,这个解决方案

  • 问题内容: 我正在尝试在用户空间中使用mmap读取“ mem_map”开始的物理内存。它是一个包含所有物理页面的数组。这是一台运行3.0内核的i386计算机。 代码是这样的: 我以此为根。输出为: 可以肯定的是,我搜索了问题并将以下行添加到我的/etc/sysctl.conf文件中: 但这也不起作用。 谁知道为什么不允许这样的mem_map操作,以及如何解决呢? 谢谢。 问题答案: 听起来好像内核

  • 当我试图打开索引时。php在浏览器中我看到错误: 在error.log: 2013/11/04 22:40:07[错误]3435#0:*4发送到stderr的FastCGI:“无法打开主脚本:/var/www/index.php(不允许操作)”,同时从上游读取响应头,客户端:10.0。2.2,服务器:localhost,请求:“GET/HTTP/1.1”,上游:fastcgi://127.0.0.

  • 操作将 转换为包含每个输入元素的零个或多个元素的流,例如。 是否有相反的操作将几个元素分批添加到一个新的元素中? 事实并非如此。reduce(),因为这只产生一个结果 它不是collect(),因为它只填充一个容器(afaiu) 它不是forEach(),因为它只返回void,并且具有副作用 它存在吗?我可以用任何方式模拟它吗?

  • 问题内容: 我用来解析/验证用户输入。不幸的是,它在解析时允许字符作为后缀。 示例代码: 结果: 我实际上希望他们两个都有解析异常。我怎样才能告诉我不允许输入? 问题答案: 从以下文档中: 从给定字符串的开头解析文本以产生数字。 该方法可能不会使用给定字符串的整个文本。 这是一个示例,可以使您了解如何确保考虑整个字符串。 输出: