力扣1780-判断一个数字是否可以表示成三的幂的和

问题:

        给你一个整数 n ,如果你可以将 n 表示成若干个不同的三的幂之和,请你返回 true ,否则请返回 false 。

        对于一个整数 y ,如果存在整数 x 满足 y == 3x ,我们称这个整数 y 是三的幂。

提示:

        1 <= n <= 10^7

解题思路:

        3^0 = 1

        3^1 = 3

        3^2 = 9

        3^3 = 27

        3^4 = 81

        1 + 3 = 4 < 9

        4 + 9 = 13 < 27

        13 + 27 = 40 < 81

        从以上的计算可以看出一下几点

        1、除去三的零次幂的情况下,三的幂之和是三的倍数,所以一个数不是三的倍数,并且它减一也不是三的倍数,那么这个数就不可能是三的幂之和

        2、3^0 + … + 3^(n-1) < 3^n,前n-1个三的幂之和小于三的n次幂,所以要找一个数是否为三的n次幂之和,只需要减去比这个数小的最大三的幂,再减去比所得差的数小的最大三的幂,不断重复直到所得差为零时,就说明此数为三的幂之和,这里要注意不能减到同一个三的幂

代码实现:

    public boolean checkPowersOfThree(int n) {
    
        if (n % 3 != 0 && (n - 1) % 3 != 0){
            return false;
        }

        int needPowers = sqrtThree(n);
        int powers = needPowers;
        //powers >= needPowers 避免减到同一个三的幂
        while (n > 0 && powers >= needPowers){
            n -= (int)Math.pow(3, needPowers);
            powers = needPowers - 1;
            needPowers = sqrtThree(n);
        }

        return n == 0;
    }

    //3√n 向下取整
    public int sqrtThree(int n){
        int s = 0;
        while (n >= 3){
            n /= 3;
            s++;
        }

        return s;
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值