题目
给你一个整数 n ,如果你可以将 n 表示成若干个不同的三的幂之和,请你返回 true ,否则请返回 false 。
对于一个整数 y ,如果存在整数 x 满足 y == 3x ,我们称这个整数 y 是三的幂。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/check-if-number-is-a-sum-of-powers-of-three
解
1.从最大的3的幂开始,如果大于等于剩余数字,就应当使用这一幂次(因为剩下的所有幂次加起来也比它小)。看最后是否能减到0。
class Solution {
public:
bool checkPowersOfThree(int n) {
vector<int> threes{1};
while (threes.back() < n)
threes.emplace_back(threes.back() * 3);
for (int i = threes.size() - 1; i >= 0; --i) {
if (n >= threes[i])
n -= threes[i];
}
return n == 0;
}
};
2.转化为三进制
可以将 n 表示成若干个不同的三的幂之和。
三进制表示
3
0
3^0
30=1
3
1
3^1
31=10
3
2
3^2
32=100
3
3
3^3
33=1000
3
4
3^4
34=10000
3
1
3^1
31=1…0
那么n如果可以由上面这些的一些数相加而得,那么一定是转换为三进制不含2
class Solution {
public boolean checkPowersOfThree(int n) {
return n<2 || (n%3 != 2 && checkPowersOfThree(n/3));
}
}