<每日 1 OJ> -LeetCode 7. 整數反轉

題目描述

 

給定一個 32 位有符號整數,將整數中的數字進行反轉。spa

示例 1:指針

輸入: 123
輸出: 321

 示例 2:code

輸入: -123
輸出: -321

示例 3:blog

輸入: 120
輸出: 21

解題思路

利用 / 和 % 進行運算。好比 123 -> 321 編譯器

123/10=12it

123%10=3io

設temp=0;編譯

x=123;class

第一次循環:cli

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 。

相關文章
相關標籤/搜索