原题链接;
https://leetcode-cn.com/problems/power-of-four/
题目描述:
给定一个整数 (32 位有符号整数),请编写一个函数来判断它是否是 4 的幂次方。
题意很明确, 就是给一个32 位有符号整数, 判断它是不是4的整数次方( n = 4 k n=4^{k} n=4k).
为了避免歧义, 这里认为 k ≥ 0 k\ge0 k≥0
总结了下, 大致有如下几种思路:
思路1: 枚举
既然是32位整数, 就从1( 4 0 4^{0} 40)开始, 直到 2 31 − 1 2^{31} – 1 231−1,
这种方法说起来, 对可能的结果不多的情况下还是比较有效的, 不过当然一般不会这么干.
代码如下:
bool isPowerOfFour(int num) {
switch(num){
case 1 << 0:
case 1 << 2:
case 1 << 4:
case 1 << 6:
case 1 << 8:
case 1 << 10:
case 1 << 12:
case 1 << 14:
case 1 << 16:
case 1 << 18:
case 1 << 20:
case 1 << 22:
case 1 << 24:
case 1 << 26:
case 1 << 28:
case 1 << 30:
// case 1 << 32: // 这个num为0时不能通过
return true;
default:
return false;
}
}
思路2: 枚举(迭代实现)
bool isPowerOfFour(int num) {
if (num < 1) {
return false;
}
if (num & (num - 1) != 0) { // not 2^n
return false;
}
int i = 0;
int t = 0;
for (; i < 32; i += 2) {
t = 1 << i;
if (t == num) {
return true;
}
if (t > num) {
return false;
}
}
return false;
}
思路3: 使用”魔数” 0x55555555
0x55555555这个数是啥呢? 看它的二进制(4位一隔, 方便观察):
0101 0101 0101 0101 0101 0101 0101 0101
发现从右到左(从低位到高位), 其中的奇数位(1, 3, 5…)都为1, 偶数位都为0.
而4的整数幂:
k k k | 4 k 4^{k} 4k | 4 k 4^{k} 4k的二进制形式 |
---|---|---|
0 | 1 | 0000 0001 |
1 | 4 | 0000 0100 |
2 | 16 | 0001 0000 |
3 | 64 | 0100 0000 |
就写这几个吧, 能说明问题就可以, 发现:
4 k 4^{k} 4k的二进制展开中, 2 k + 1 2k+1 2k+1位为1, 其余位为0.
其实也很容易想: 4 0 = 1 4^{0}=1 40=1的二进制中1在第一位, 4 1 = 4 0 × 4 4^{1}=4^{0}\times4 41=40×4, 也就是在 4 0 4^{0} 40的基础上左移两位, 自然就有上边的结论.
有了上面的基础知识, 问题就简单了, 直接看代码吧:
bool isPowerOfFour(int num) {
return ((num & (num-1)) == 0) && num > 0 && ((num & 0x55555555) == num) ? true : false;
}
其中(num & (num-1)) == 0)
是判断num为2的整数幂, 可参看我的另一篇文章 .
思路4: 利用同余性质
先说下结论:
a ≡ b ⇒ a n ≡ b n ( m o d m ) , ( a , b , n 均 为 整 数 , 且 n ≥ 0 ) a \equiv b \Rarr a^{n} \equiv b^{n} \pmod m, \space\space (a, b, n均为整数,且n \ge 0) a≡b⇒an≡bn(modm), (a,b,n均为整数,且n≥0)
那么, 令 a = 2 , b = − 1 , m = 3 a=2, b=-1, m = 3 a=2,b=−1,m=3, 则: 2 ≡ − 1 ⇒ 2 n ≡ ( − 1 ) n ( m o d 3 ) 2\equiv-1 \Rarr 2^{n}\equiv(-1)^{n} \pmod 3 2≡−1⇒2n≡(−1)n(mod3),
当 n = 2 k ( k ≥ 0 ) n=2k \space (k \ge 0) n=2k (k≥0), 即n为偶数时, 有:
2 2 k ≡ ( − 1 ) 2 k ⇒ 4 k ≡ 1 ( m o d 3 ) , ( k ≥ 0 ) 2^{2k} \equiv (-1)^{2k} \Rarr 4^{k} \equiv 1 \space \pmod 3, (k \ge 0) 22k≡(−1)2k⇒4k≡1 (mod3),(k≥0)
也就是说:
4的幂等于3的整数倍再加1
那么:
bool isPowerOfFour(int num) {
return num > 0 && (num & (num - 1)) == 0 && (num - 1) % 3 == 0 ? true : false;
}
csdn博客这latex公式怎么左对齐? 多行公式怎么以等号为标准对齐? 求告知.
结论 a ≡ b ⇒ a n ≡ b n ( m o d m ) , ( a , b , n 均 为 整 数 , 且 n ≥ 0 ) a \equiv b \Rarr a^{n} \equiv b^{n} \pmod m, \space\space (a, b, n均为整数,且n \ge 0) a≡b⇒an≡bn(modm), (a,b,n均为整数,且n≥0)的证明如下(数学归纳法):
- 当 n = 0 , 1 n=0, 1 n=0,1时, 命题显然成立;
- 假设当 n = k ( k ≥ 2 ) n=k \space (k\ge2) n=k (k≥2)时, a k ≡ b k ( m o d m ) a^{k} \equiv b^{k} \pmod m ak≡bk(modm)成立,即 a k − b k = q m ( q 为 整 数 ) a^{k} – b^{k} = qm \space (q为整数) ak−bk=qm (q为整数);
- 那么当 n = k + 1 n=k+1 n=k+1时
∵ a ≡ b ( m o d m ) \because a \equiv b \pmod m ∵a≡b(modm)
∴ a − b = l m ( l 为 整 数 ) \therefore a – b = lm \space (l为整数) ∴a−b=lm (l为整数)
∴ a k + 1 − b k + 1 = a k + 1 − a b k + a b k − b k + 1 = a ( a k − b k ) + ( a − b ) b k = a q m + l m b k = m ( a q + l b k ) = m K ( K 为 整 数 ) \begin{aligned} \therefore a^{k+1} – b^{k+1} = a^{k+1} – ab^{k} + ab^{k} – b^{k+1} \\ = a(a^{k} – b^{k}) + (a – b)b^{k} \\ = aqm + lmb^{k} \\ = m(aq + lb^{k}) \\ = mK \space (K为整数) \\ \end{aligned} ∴ak+1−bk+1=ak+1−abk+abk−bk+1=a(ak−bk)+(a−b)bk=aqm+lmbk=m(aq+lbk)=mK (K为整数)
也就是说: a k + 1 ≡ b k + 1 ( m o d m ) a^{k+1} \equiv b^{k+1} \pmod m ak+1≡bk+1(modm)成立
故由数学归纳法知, 原命题成立.
证毕.
参考
https://blog.csdn.net/u010564321/article/details/51210749
https://www.zybang.com/question/4627e5673ce201796fa7e9da810e3d30.html
欢迎补充指正!