问题:
给你一个整数 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;
}