zoukankan      html  css  js  c++  java
  • [LeetCode]Power of N

    题目:Power of Two

    Given an integer, write a function to determine if it is a power of two.

    题意:判断一个数是否是2的k次方数。

    思路:

    2的次方数使用2进制表示则必然只有最高位是1其他都是0;

    这样判断一个数最多需要循环32次就能得出结果。

    则程序如下:

    bool isPowerOfTwo(int n){
        if (!n)return false;
        while ((n&0x01) != 0x01){//2的次方则只有最高位是1
            n = n >> 1;
        }
        return n == 1;
    }

    但是这样还有循环,如何不使用循环一下子判断出来呢?

    思路2:

    2的次方使用二进制只有一个1,而是用下面的方法,可以判断一个二进制序列中只有一个1.

    n&(n-1);//n-1会将n中从小到大第一个为1的位置变成0,这样就能判断只有一个1的情况。

    bool isPowerOfTwo(int n){
        //2的幂只有一个1,则使用n&(n-1)来统计1的个数
        return n > 0 && !(n & (n - 1));
    }

    题目:Power of Three

    Given an integer, write a function to determine if it is a power of three.

    Follow up:
    Could you do it without using any loop / recursion?

    题意:判断一个数是否是3的k次幂数。

    要求:不能使用递归或循环。

    思路:

    如果可以使用循环,也很简单每次对3求余,就可以了。

    bool isPowerOfThree(int n) {
        while (n >= 3){
            if (n % 3)return false;
            n /= 3;
        }
        return n == 1;
    }

    但是,要求不使用循环或递归。

    仔细想想,3的k次幂的数就是,该数的因子只有3,那么使用一个在int范围内最大的3的k次幂的数对给定的数求余,如果为0就说明它是3的k次幂的数。

    扩展开来,所有的判断n的k次幂的数都是可以使用这个方法。

    bool isPowerOfThree(int n) {
        //int中3的最大次幂数1162261467 
        return n > 0 && !(1162261467 % n);
    }

    题目:Power of Four

    Given an integer (signed 32 bits), write a function to check whether it is a power of 4.

    Example:
    Given num = 16, return true. Given num = 5, return false.

    Follow up: Could you solve it without loops/recursion?

    题意:判断一个数是否是4的k次幂数。

    要求:不能使用递归或循环。

    思路:

    4的次幂,乍一看好像和2的次幂差不多,能不能用类似的方法来求解呢?

    仔细一想肯定发现不能单纯判断一个1来判断4的次幂,为什么呢?因为4的次幂写成2进制,1只会出现奇数的位置上,当然排除1的情况。

    那么只需要在判断1是不是在奇数的位置上是不是就可以判断它是不是4的k次幂。

    推敲一下发现可行,程序如下:

    bool isPowerOfFour(int n){
        return n > 0 && !(n & (n - 1)) && ((n & 0x55555555) == n);//0x55555555保证在奇数的位置上的1被保留
    }

    思路2:

    还有一个思路,4^k - 1 = ?

    如果k是偶数,不妨设k = 2;因式分解得到(4 - 1)*(4 + 1);

    如果k是奇数,不妨设k = 3;因式分解得到(4 - 1)*(4^2 + 4 + 1);

    如果k > 2;不妨设k = 2t,则因式分解得到(4^t - 1)*(4^t + 1)

    (4^t - 1)同上面的情况,可以发现总可以分出一个(4 - 1)的因子,所以,4^k - 1 必定会有3的因子。

    数学不精,没办法精确证明。

    bool isPowerOfFour(int n){
        return n > 0 && !(n & (n - 1)) && !((n - 1)%3);
    }
  • 相关阅读:
    黄金眼游戏
    四则运算
    关于构建之法的一些问题
    WorkConter
    python 列表构造时的引用问题
    网站前端求职的经历记录
    弱类型语言、强类型语言?
    关于JAVA的Random类的冷知识(转自菜鸟V)
    节后大礼包!XSql 源码开放,插件源码开放,Sofire v1.6 源码开放(已上传)
    【转】ASP.NET 尖括号 百分号 井号 等号 的用法
  • 原文地址:https://www.cnblogs.com/yeqluofwupheng/p/7347778.html
Copyright © 2011-2022 走看看