swift算法:2的幂

1、描述

给定一个整数,编写一个函数来判断它是否是2的幂次方

例1:输入:1

          输出:true

          解释:2^0 = 1

例2:输入:16

          输出:true

          解释:2^4 = 16

例3:输入:218

          输出:false

 

2、算法

1)二进制

思想: 1、数字n若是2的次方,则一定满足以下条件:
                      1)二进制表示下,n最高位为1,其余所有位为0;
                      2)二进制表示下,n - 1最高位为0,其余所有位为1(除了n == 1的情况下,n - 1 == 0,即末位为最高位);
                      3)n <= 0时一定不是2的次方。
            2、因此,判断n > 0且n & (n - 1) == 0则可确定n是否是2的次方。

func isPowerOfTwo(_ n : Int)->Bool{
        /*
         二进制:
        
         */
        return n>0 && (n & (n-1) == 0)
    }
    

2)递归

思想: 逐步增加除数的大小,每次增加为之前除数的2倍,如果除以除数为0,则除数重新置位2,以递归的方式重新计算

func isPowerOfTwo(_ n : Int)->Bool{
        /*
         递归
        
         */
        if n == 0 {
            return false
        }else{
            return cal(n)
        }
    }
    private func cal(_ n : Int)->Bool{
        var n = n
        var div = 2
        while (n/div != 0) && (n%div == 0) {
            n = n / div
            div = div*2
        }
        if n%2 == 0 {
            return cal(n)
        }else if n == 1 {
            return true
        }else{
            return false
        }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值