「ALBB面試題」python
【題目】面試
如何判斷一個數是否爲2的n次方ide
【題目分析】spa
看到這種題,相信你們第一反應就是循環除2,這樣作確定是能夠得出結果的;可是這種作法無疑大大增長了計算機的運行時間,一個很是大的數字可能會讓計算機內存溢出,有沒有更好的解決方式呢?有!若是你對數字2敏感,那麼必定會想到二進制方法,20=0b一、21=十、22=0b100、23=0b1000......經過找規律發現,只要是2的n次方,它的二進制表示形式中1只有一個。因此本題轉換爲判斷一個數字的二進制形式中1是否只有一個。那麼該如何統計呢?3d
方法一:將其轉換爲字符串,以後統計1的個數code
方法二:再仔細觀察,20-1=0、21-1=0b0一、22-1=0b0十一、23-1=0b0111......,獲得規律:若是一個數字i爲2的n次方,則 i&(i-1)=0 (推薦)blog
【解答】內存
方法一:utf-8
1 #!/Users/minutesheep/.pyenv/shims/python 2 # -*- coding: utf-8 -*- 3 4 5 def isPower(n): 6 ''' 7 判斷是否爲2的n次方 8 ''' 9 try: 10 n = str(bin(n)) 11 if n.count('1') == 1: 12 return print('是2的n次方') 13 return print('不是2的n次方') 14 except: 15 return print('錯誤:只接收數字') 16 17 18 if __name__ == '__main__': 19 test_num = 2048 20 isPower(test_num)
是2的n次方
方法二:字符串
1 #!/Users/minutesheep/.pyenv/shims/python 2 # -*- coding: utf-8 -*- 3 4 5 def isPower(n): 6 ''' 7 判斷是否爲2的n次方 8 ''' 9 try: 10 if n&(n-1) == 0: 11 return print('是2的n次方') 12 return print('不是2的n次方') 13 except: 14 return print('錯誤:只接收數字') 15 16 17 if __name__ == '__main__': 18 test_num = 2048 19 isPower(test_num)
是2的n次方