• <每日 1 OJ> -LeetCode 7. 整数反转


    题目描述

    给定一个 32 位有符号整数,将整数中的数字进行反转。

    示例 1:

    输入: 123
    输出: 321
    

     示例 2:

    输入: -123
    输出: -321
    

    示例 3:

    输入: 120
    输出: 21

    解题思路

    利用 / 和 % 进行运算。比如 123 -> 321 

    123/10=12

    123%10=3

    设temp=0;

    x=123;

    第一次循环:

    temp=temp*10+x%10

           =3

    x=x/10

      =12

    第二次循环:

    temp =3*10+2

             =32

    x=1

    第三次循环:

    temp=321

    x=1/10=0;

    c语言中1%10=1怎么理解?
    %在C语言中是一个取余数的符号
    在本题中1%10就是1/10后取余数,而1不够除以10,所以取商等于0,根据余数=被除数-除数*商=1-10*0=1,即得余数为一
    所以输出1
    

     所以当x=0时 ,输出temp 即为翻转数。

    代码

     1 #include "stdafx.h"
     2 #include "stdlib.h"
     3 
     4 int _tmain(int argc, _TCHAR* argv[])
     5 {
     6     int reverse(int x);
     7     int num ,reverseNum;
     8     scanf("%d",&num);
     9     reverseNum=reverse(num);
    10     printf("%d", reverseNum);
    11     system("pause");
    12     return 0;
    13 }
    14 
    15 int reverse(int x)
    16 {
    17   int temp=0;
    18   while(x%10!=0||x/10!=0)
    19   {
    20    if(temp<-214748364||temp>214748364)
    21    {
    22        return 0;
    23 
    24    }
    25    temp=temp*10+x%10;
    26    x=x/10; 
    27   }
    28   return temp;
    29 }

    补充1:溢出问题:

    对于正数,反码,补码与原码相同。
    对于负数,补码是原码的符号位不变,数值部分按位取反再加1。

    short型数据是16位表示最高位是符号位,所以只有15位表示数值,15位000000000000000-111111111111111表示的范围是0-32767,又加上最高位的符号位(第16位),就可以表示-32768-32767 。unsigned short型数据是16位都用来表示数值,16位0000000000000000-1111111111111111表示的范围是0-65535。
    计算机在进行计算时是用补数计算的,且如果溢出会进行丢位处理。如short型32767补码是0111111111111111 加1后为1000000000000000(注意最高位是符号位),1000000000000000正是-32768的补数。
    而unsigned short型数据无符号65535为1111111111111111(16位),加1后为10000000000000000(17位)这时计算机判断溢出后丢弃第17位,变为0000000000000000就是0了

    补充2:溢出和取值范围

     

    《C和指针》中写过:long与int:标准只规定long不小于int的长度,int不小于short的长度。

    double与int类型的存储机制不同,long int的8个字节全部都是数据位,而double是以尾数,底数,指数的形式表示的,类似科学计数法,因此double比int能表示的数据范围更广。

    long long在win32中是确实存在,长度为8个字节;定义为LONG64。 
    为什么会出现long int呢?在win32现在系统中,长度为4;在历史上,或者其他某些系统中,int长度为2,是short int。 
    即便是long long,在TI的有款平台中,长度为5也就是说,每种类型长度,需要sizeof才知道,如果可能,最好用union看看里面的数据,可以消除一些类型的假象长度。

    类型名称        字节数    取值范围
    signed char       1        -128~+127
    short int         2        -32768~+32767
    int               4        -2147483648~+2147483647
    long int          4        -2147483648~+2141483647
    long long long int  8      -9223372036854775808~+9223372036854775807
    unsigned int  (unsigned long)
    4字节8位可表达位数:2^32=42 9496 7296  
    范围:0 ~ 42 9496 7295 (42*10^8)  
    
    int  (long)
    4字节8位可表达位数:2^32=42 9496 7296  
    范围:-21 4748 3648 ~ 21 4748 3647 (21*10^8)
    
    long long (__int64)
    8字节8位可表达位数:2^64=1844 6744 0737 0960 0000  
    范围:-922 3372 0368 5477 5808 ~ 922 3372 0368 5477 5807 (922*10^16)
    
    unsigned long (unsigned __int64)
    8字节8位可表达位数:2^64=1844 6744 0737 0960 0000  
    范围:0 ~ 1844 6744 0737 0955 1615 (1844*10^16)

    最大值、最小值

    #include<climits>存有各个类型的最大值和最小值
    CHAR_MIN       char的最小值
    SCHAR_MAX      signed char 最大值
    SCHAR_MIN       signed char 最小值
    UCHAR_MAX      unsigned char 最大值
    SHRT_MAX       short 最大值
    SHRT_MIN       short 最小值
    USHRT_MAX      unsigned short 最大值
    INT_MAX       int 最大值
    INT_MIN        int 最小值
    UINT_MAX       unsigned int 最大值
    UINT_MIN        unsigned int 最小值
    LONG_MAX      long最大值
    LONG_MIN       long最小值
    ULONG_MAX      unsigned long 最大值
    FLT_MANT_DIG    float 类型的尾数
    FLT_DIG         float 类型的最少有效数字位数
    FLT_MIN_10_EXP   带有全部有效数的float类型的负指数的最小值(以10为底)
    FLT_MAX_10_EXP    float类型的正指数的最大值(以10为底)
    FLT_MIN        保留全部精度的float类型正数最小值
    FLT_MAX        float类型正数最大值

    自己推算:

    以int类型为例: 
    int为4字节32位,其中首位用0表示正数,用1表示为负数。因此对于 
    最大正数可以表示为:0x7fff ffff(7的二进制为0111,f二进制为1111) 
    最大负数(-1)可以表示为:0xffff ffff 
    最小负数可以表示为:0x8000 0000(8的二进制为1000)

    补充3:

    INT_MIN在标准头文件limits.h中定义。

    1 #define INT_MAX 2147483647
    2 #define INT_MIN (-INT_MAX - 1)//这里没有简单地将INT_MIN赋值成-2147483647,是因为-2147483648对于编译器而言是个表达式,而2147483648对于32-bit整数是无法表示的,
    所以经过这个表达式的结果是未定义的。在GCC上直接写-2147483648后,编译器给出了警告,说结果是unsigned。

    在C/C++语言中,不能够直接使用-2147483648来代替最小负数,因为这不是一个数字,而是一个表达式。表达式的意思是对整数21473648取负,但是2147483648已经溢出了int的上限,所以定义为(-INT_MAX -1)。

    C中int类型是32位的,范围是-2147483648到2147483647 。 
    (1)最轻微的上溢是INT_MAX + 1 :结果是 INT_MIN; 
    (2)最严重的上溢是INT_MAX + INT_MAX :结果是-2; 
    (3)最轻微的下溢是INT_MIN - 1:结果是是INT_MAX; 
    (4)最严重的下溢是INT_MIN + INT_MIN:结果是0 。



  • 相关阅读:
    nginx syslog 配置
    通过granfana 以及prometheus 比较zulu 、oracle、openjdk 等jvm 运行
    cube.js 新版本试用preosto
    关于redash 自定义可视化以及query runner 开发的几篇文章
    通过redash query results 数据源实现跨数据库的查询
    cube.js 最近版本的一些更新
    zeebe 0.20.0 集群部署试用
    redash oracle 数据源docker 镜像
    使用jmx-exporter&&jmxtrans && nexus jmx 暴露nexus 系统指标信息
    jmxtrans docker-compose 运行
  • 原文地址:https://www.cnblogs.com/mhq-martin/p/11356254.html
Copyright © 2020-2023  润新知