第十四届蓝桥杯集训——if——配套用法示例
第十四届蓝桥杯集训——if——配套用法示例
目录
输入一个数n,判断n是否是2的指数。
n的取值范围(0=>n<=
)题目看着很简单,其实在比较小的数上还是挺容易做的,但是依然要使用循环进行处理。
把这个数多次除以2,
如果可以整除,
是2的指数倍,
如果不可以,就不是,但是循环我们还没有学习呢,不能用循环处理,而且利用这种方式根本无法判断要循环多少次,根据取值范围可以直接套31次循环。每次都循环这么多次,复杂度这就不低了。所以我们尽量用一次判断来解决它。
但是今天我们不使用循环,我们就使用一个【&】符号来判断这个n是否是2的指数。
推理:
有一个数2,这个数是否是2的指数。
2进行二进制处理,得出:【10】,如果【10】&【01】正好等于【00】,我们知道,如果是2的指数那么一定会是100000……的方式。故而我们有,如果二进制的这个数-1与n这个数进行&的位运算结果一定是00000,……,所有我们就可以用一个表达式来计算这个n是否是2的指数了。
方法1
接下来我们上代码:
举例数字1:2二进制:10,有: 10&(10-1)=10&01=00
举例数字2:8二进制:1000,有1000&(1000-1)=1000&0111=0000
后面的数字都是一个逻辑,计算完成后都是0000。
输入测试1024,输出结果true。
方法2
我们利用2的31次幂来直接计算,这种方法的复杂度也是O(1)
输入测试1024,输出结果true。
其实我们学会第二种方法后,无论是int范围还是long范围的所有数我们就都会判断了。
其它指数幂
例如:判断一个数是否是7的指数。
先计算7在int范围内的最大指数值,在进行对这个数n的取模计算即可。
输入测试49,输出结果true
- 点赞
- 收藏
- 关注作者
评论(0)