最近做了一道题目:

Given a 32-bit signed integer, reverse digits of an integer.

Example 1:

  1. Input: 123
  2. Output: 321

Example 2:

  1. Input: -123
  2. Output: -321

Example 3:

  1. Input: 120
  2. Output: 21

Note:
Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231,  231 − 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.

来源:https://leetcode.com/problems/reverse-integer/

先贴上自己丑陋的代码:

  1. class Solution {
  2. public:
  3. int reverse(int x) {
  4. bool isNegative=false;
  5. if(x==||x<-*pow(,)+||x>pow(,)-)
  6. return ;
  7. if(x<){
  8. isNegative=true;
  9. x=-*x;
  10. }
  11. while(x%==)
  12. x=x/;
  13. int ans=,temp;
  14. temp=x-(x/)*;
  15. while(x>=&&ans<pow(,)/){
  16. ans=ans*;
  17. ans+=temp;
  18. x=x/;
  19. temp=x-(x/)*;
  20. }
  21. if(x>=)
  22. return ;
  23. if(isNegative)
  24. ans=ans*(-);
  25. return ans;
  26. }
  27. };

(单从速度角度来看,好像还可以?).

但是看到了讨论区一个意大利大佬的代码,确实是short and element:

  1. public int reverse(int x) {
  2. int prevRev = , rev= ;
  3. while( x != ){
  4. rev= rev* + x % ;
  5. if((rev - x % ) / != prevRev){
  6. return ;
  7. }
  8. prevRev = rev;
  9. x= x/;
  10. }
  11. return rev;
  12. }

不像我傻傻地用pow判断溢出,这段代码的判定语句很特别:

  1. if((rev - x % 10) / 10 != prevRev){
  2. return 0;
    我放到vs里测试了一下,打印了结果出来。
    测试代码:
  1. cout << rev << endl;
  2. rev = rev * + x % ;
  3. cout << "afterchange:" << rev << endl;

结果:

关键是最后一行,应该是9646324351的结果变成了1056389759.这应该就是Int溢出的结果。

通过查找网络资料,看到有一个答案说的是对的(https://zhidao.baidu.com/question/1899917410883143460.html?qbl=relate_question_0&word=C%2B%2B%20Int%D4%CB%CB%E3%B3%AC%B3%F6%B7%B6%CE%A7)

C语言int占4个字节,一共32位,范围是-2147483648 ~ 2147483647。

如果超出这个范围,就会加上或减去4294967296,使得值还落在这个范围内。
比如定义int变量a的值为2147483647,再加1就是2147483648,超出范围,因此需要减掉4294967296,最后打印的值就是-2147483648

  1. 实际上,1056389759就是9646324351-2*4294967296.也就是减去了两倍的“模长”。
    不像一开始就输入一个超出Int范围的整数时的情况,编译器不会发现超出范围、不会报错(因为这更像一个逻辑错误,是运行中产生的),只会在运行的过程中通过“减模长”的形式使其在范围内。
    所以,之后判断Int超出时,可以使用一个整数来配合检查,其的作用是保存变换之前的整数,以此和变换后的整数通过变换公式来检查变换是否正确,如果变换发生了异常,则说明超出了范围。
    当然,也可以通过一个Long来保存正确结果,通过和这个Long的数值比较来确定有没有出现问题。但是这样的话好像就没有太大意义了(笑~)

C++-int类型整数超出范围后的处理的更多相关文章

  1. 编程计算int类型整数的最大值和最小值

    方法一:将一个int类型整数不断加1,加到最大值,再加1,就变成负值(最小值) 最大值就是除最高位外,其余位都为1,-1即是所有位全部是1,右移1位后最高位变0   最小值即是最高位为1,其余位为0, ...

  2. 通过移位与或非运算获取整形最大值,最小值,以及获取输入的int类型整数的二进制表示

    以上是最终效果 实现类: package com.corejava.chap02; public class IntBin { private int value; public IntBin(int ...

  3. double类型转换为int类型四舍五入工具类

    package com.qiyuan.util; import java.math.BigDecimal; import java.text.DecimalFormat; public class G ...

  4. mysqlint类型的长度值mysql在建表的时候int类型后的长度代表什么

    详解mysql int类型的长度值 mysql在建表的时候int类型后的长度代表什么 是该列允许存储值的最大宽度吗 为什么我设置成int(1), 也一样能存10,100,1000呢. 当时我虽然知道i ...

  5. java中整数的默认为int类型的一些问题

    thingking in java 读书感悟 作者 :淮左白衣 写于2018年4月8日17:51:44 关于整数的默认类型,以及会产生的一些小问题 涉及基本数据类型的重载 关于整数的默认类型,以及会产 ...

  6. int类型的整数转换成汉字

    int类型的整数转换成汉字 一.源代码:IntegerNumberToChinese.java package cn.com.zfc.example; import java.util.Scanner ...

  7. 写一个函数,输入int型,返回整数逆序后的字符串

    刚刚看到一个面试题:写一个函数,输入int型,返回整数逆序后的字符串.如:输入123,返回"321". 要求必须用递归,不能用全局变量,输入必须是一个參数.必须返回字符串.&quo ...

  8. 两个int类型的数据相加,有可能会出现超出int的表示范围。

    两个int类型的数据相加,有可能会出现超出int的表示范围. /* 移位运算符: <<(左移) 规律:一个操作数进行左移运算的时候,结果就是等于操作数乘以2的n次方,n就是左移 的位数. ...

  9. 剑指offer12:求解double类型的浮点数base和int类型的整数exponent的次方。 保证base和exponent不同时为0

    1. 题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方.保证base和exponent不同时为0. 2. 思路和方法 分析: 由于 ...

随机推荐

  1. PhpStorm 常用插件

    PhpStorm 插件 Dash : Dash 需要配合软件 Dash 使用. IdeaVim IdeaVim 对于习惯于使用 Vim 操作方式的人来说是个大福音. IdeaVim 也有默认配置, 可 ...

  2. 用 PLSQL 创建新用户及导入 dmp

    一.创建表空间 在导入 dmp 文件之前,你要在数据库里面给它分配一片存储它的地方(表空间). 如果我们知道需要导入的数据库的表空间直接创建就可以,如果不不知道,也没有关系,我们可以用 txt 打开 ...

  3. QQ的孤独

    接触网络到现在,已是好多年前的事了.初识网络犹如初恋般,充满了新鲜和好奇,于是,从聊天室到QQ,MSN,邮箱,再去BBS.然后有了博客^^^^^^ 那时的网络于我是那般充满诱惑,整天穿梭其中,乐此不彼 ...

  4. kernel笔记——VFS

    vfs(the virtual filesystem, virtual file switch)为应用程序访问文件提供了统一的接口,如read.write.open等. 下面我们看加载文件系统模块.格 ...

  5. pytorch Debug —交互式调试工具Pdb (ipdb是增强版的pdb)-1-在pytorch中使用

    参考深度学习框架pytorch:入门和实践一书第六章 以深度学习框架PyTorch一书的学习-第六章-实战指南为前提 在pytorch中Debug pytorch作为一个动态图框架,与ipdb结合能为 ...

  6. app原生和H5混合使用自动化

    1.从原生切换到H5需要 driver.switch_to.context('WEBVIEW_com.tencent.mm:tools') 2.参考连接: https://testerhome.com ...

  7. Vue-异步组件

    一般情况下,在代码开头引入组件: import Vue from 'vue' import Router from 'vue-router' import Home from '@/pages/hom ...

  8. JS-数组操作3

    1. 找出数组 arr 中重复出现过的元素 function duplicates(arr) { var result = []; var count = []; for (var i=0;i< ...

  9. 比sun.misc.Encoder()/Decoder()的base64更高效的mxBase64算法

    package com.mxgraph.online; import java.util.Arrays; /** A very fast and memory efficient class to e ...

  10. mysql 解压版安装

    1.官网下载压缩包 2.解压 3.配置环境变量 添加系统环境变量  MYSQL_HOME 值为解压的主目录,例如     D:\mysql-5.7.25-winx64 修改Path 环境变量,点击编辑 ...