#6 判斷一個數是否為2的n次方

「ALBB面試題」

【題目】

如何判斷一個數是否為2的n次方

【題目分析】

看到這種題,相信大家第一反應就是循環除2,這樣做肯定是可以得出結果的;但是這種做法無疑大大增加了計算機的運行時間,一個非常大的数字可能會讓計算機內存溢出,有沒有更好的解決方式呢?有!如果你對数字2敏感,那麼一定會想到二進制方法,20=0b1、21=10、22=0b100、23=0b1000……通過找規律發現,只要是2的n次方,它的二進製表示形式中1隻有一個。所以本題轉換為判斷一個数字的二進制形式中1是否只有一個。那麼該如何統計呢?

方法一:將其轉換為字符串,之後統計1的個數

方法二:再仔細觀察,20-1=0、21-1=0b01、22-1=0b011、23-1=0b0111……,得到規律:如果一個数字i為2的n次方,則 i&(i-1)=0 (推薦)

【解答】

方法一:

《#6 判斷一個數是否為2的n次方》
《#6 判斷一個數是否為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         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)

程序源代碼
《#6 判斷一個數是否為2的n次方》
《#6 判斷一個數是否為2的n次方》

是2的n次方

運行結果

方法二:

《#6 判斷一個數是否為2的n次方》
《#6 判斷一個數是否為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)

程序源代碼
《#6 判斷一個數是否為2的n次方》
《#6 判斷一個數是否為2的n次方》

是2的n次方

運行結果

点赞

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *