首先,給出c語言和python同一語義的不同表達方式,然後再使用c語言和python分別解LeetCode題:LeetCode7.翻轉整數。
C語言和Python中的整除“/”和取餘“%”
c語言:7 / 4 = 1Python:7 // 4 = 1 //Python中 7 / 4 = 1.75 表示浮點數除法;雙斜槓 //表示整數除法
再看一下符號對整除是否有影響:
c語言: python: 7 / 4 = 1 7 // 4 = 1 -7 / 4 = -1 -7 // 4 = -27 / -4 = -1 7 // -4 = -2-7 / -4 = 1 -7 // -4 = 1
可以看出,除數和被除數符號不同時,計算結果是不同的。
再看一下,取餘C語言和python是否有區別:
c語言: python: 7 % 4 = 3 7 % 4 = 3 -7 % 4 = -3 -7 % 4 = 17 % -4 = -3 7 % -4 = -1-7 % -4 = -3 -7 % -4 = -3
可以看出,除數和被除數符號不同時,計算結果是不同的。
結論:
當除數與被除數符號一致時,整除和 取餘運算在c語言和python中所得結果是一樣的;
當除數與被除數符號不一致時,注意調整python中符號。
整除時,除數和被除數符號不一致時,調整完除數的符號時,要根據結果看是否調整最後結果的符號;
取餘時,除數和被除數符號不一致時,由於結果與除數符號相同,只需要調整除數符號即可。
C語言和Python中的“與或非”
C語言: 或 || 與&&if (ans > IntMax / 10 || (ans == IntMax / 10 && pop > IntMax % 10)) return 0;if (ans < IntMin / 10 || (ans == IntMin / 10 && pop < IntMin % 10)) return 0;Python: 或or 與andif ans > IntMax // 10 or (ans == IntMax // 10 and pop > IntMax % 10): return 0 if ans < -(IntMin // -10) or (ans == -(IntMin // -10) and pop < IntMax % -10): return 0
C語言和Python中的32位最大整數
C語言:#define INTMAX ((unsigned)(-1)>>1)#define INTMIN (~INTMAX)Python://Python沒有宏定義 IntMax = 2 ** 31 - 1//指數^用**表示 IntMin = -2 ** 31
LeetCode7.整數翻轉
給你一個 32 位的有符號整數 x ,返回 x 中每位上的數字反轉後的結果。如果反轉後整數超過 32 位的有符號整數的範圍 [−2^31, 2^31 − 1] ,就返回 0。假設環境不允許儲存 64 位整數(有符號或無符號)。
示例 1:
輸入:x = 123
輸出:321
示例 2:
輸入:x = -123
輸出:-321
示例 3:
輸入:x = 120
輸出:21
示例 4:
輸入:x = 0
輸出:0
思路分析:
我們可以一次構建反轉整數的一位數字。在這樣做的時候,我們可以預先檢查向原整數附加另一位數字是否會導致溢位。反轉整數的方法可以與反轉字串進行類比。我們想重複“彈出” x 的最後一位數字,並將它“推入”到 ans 的後面。最後,ans 將與 x 相反。要在沒有輔助堆疊 / 陣列的幫助下 “彈出” 和 “推入” 數字,我們可以使用數學方法。
彈出:int pop = x % 10;x /= 10; 推入:ans = ans * 10 + pop;
但是,這種方法很危險,因為當ans = ans * 10 + pop; 時會導致溢位。但是我們可以事先檢查這個語句是否會導致溢位很容易。在程式碼ans = ans * 10 + pop;前邊加入檢查:
if ans > IntMax // 10 or (ans == IntMax // 10 and pop > IntMax % 10): return 0if ans < -(IntMin // -10) or (ans == -(IntMin // -10) and pop < IntMax % -10): return 0
下邊給出C語言和python 的完整程式碼:
c語言:
#include<stdio.h>#include<stdlib.h>#define INTMAX ((unsigned)(-1)>>1)#define INTMIN (~INTMAX)int reverse(int x){ int ans = 0; int IntMax = INTMAX; int IntMin = INTMIN; while (x != 0) { int pop = x % 10; x /= 10; if (ans > IntMax / 10 || (ans == IntMax / 10 && pop > IntMax % 10)) return 0; if (ans < IntMin / 10 || (ans == IntMin / 10 && pop < IntMin % 10)) return 0; ans = ans * 10 + pop; } return ans;}int main(){ int x = -2147483647; int ans = reverse(x); printf("%d\n", ans); return 0;}
Python: