231. 2 的幂
难度:简单
问题描述:
给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。
如果存在一个整数 x 使得 n == 2**x ,则认为 n 是 2 的幂次方。
示例 1:
输入:n = 1
输出:true
解释:2**0 = 1
示例 2:
输入:n = 16
输出:true
解释:2**4 = 16
示例 3:
输入:n = 3
输出:false
示例 4:
输入:n = 4
输出:true
示例 5:
输入:n = 5
输出:false
进阶:你能够不使用循环/递归解决此问题吗?
这个题虽说难度为简单,但如果按进阶要求解决,就比较有意思了。
分析:
我们知道:一个整数如果是2的幂,则这个整数除以2,余数为零,将商继续除以2,余数还是为零,再将商除以2,如此反复处理,最后肯定是商1余数为0。因此我们构建循环进行这样的处理,如果每一步的余数为0且最终商为1,则说明这个整数是2的幂,否则不是,但如果这样处理就落入俗套了,那进阶解法是如何不使用循环或递归来解决问题呢?
大家不要忘记计算机是以二进制为基础的,二进制数的特点对于解决这个问题具有天然的优势。
先通过列举了解一下,注意列举式依次是:2**指数 = 十进制形式 ——> 二进制形式
2**0=1 ——> 1
2**1=2 ——> 10
2**2=4 ——> 100
2**3=8 ——> 1000
2**4=16 ——>10000
......
可以看出:一个整数如果是2的幂,其二进制形式只包含一个1,其它都是0,根据这样一个特点,我们的程序就很好设计了。
程序如下:
#对输入的整数x进行判断,如果是2的幂,返回True,否则返回False
def pd(x):
y=bin(x)[2:]
if y.count('1')==1:
return True
else:
return False
#输入整数n,并输出n是否是2的幂
n=int(input('pls input n='))
print(pd(n))
运行实例1:
pls input n=15
False
运行实例2:
pls input n=256
True
运行实例3:
pls input n=1024
True
运行实例4:
pls input n=1022
False
解决问题一般我们是按照常规的思路去进行,常规思路是大众化的解决方案,有时会有使蛮力的感觉,费力不讨好,但这种常规思维可以让人炼出扎实的基本功,而非常规思路解决问题会让人有投机取巧的感觉,但往往事半功倍,因而具有很明显的优势,给问题的解决带来极大的方便。常规思维是主流,80-90%的问题都要用常规思维去解决,但偶尔投机取巧一下,不也是很美妙的事情吗?