题目地址https://leetcode-cn.com/problems/power-of-three/comments/

1. 题目

给定一个整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回 true ;否则,返回 false

整数 n 是 3 的幂次方需满足:存在整数 x 使得 n == 3x

输入 27 0 9 45
输出 true false true false

提示:-231 <= n <= 231 - 1 进阶:你能不使用循环或者递归来完成本题吗?

2. 解题思路

本题注意以下几点:

  • 3x 是一个幂函数,所以肯定非负
  • 要求 x 为一个整数,所以 n 的输入必须大于 0
  • n 为一个整数,即不存在 x 为负数的情况
  • 319 = 1162261467 已经达到给定整数的最大值

  • [ ] 第一种思路:找出 n 以内所有质数(不包括 3),且 n 不可以被这些整数整除。不建议采用,显然不是最优的方法

  • 第二种思路:因为 19 次方已经是最大值,那么依次循环判断即可
  • 第三种思路:给定整数如果是 3 的幂次方,那 1162261467 一定可以被它整除
  • 第四种思路:对于10进制数来说,10 的 n 次幂表达为 10,100,1000;对于 2 进制数来说,2 的 n 次幂的二进制表达为 10, 100, 1000;显然,3 进制同理

总结:显然,第三种思路比较简洁,实现起来也最简单,下面我们就还是以第三种思路作为实现方式。第四种思路很标新立异,但实际上将整数字符串转换为三进制其实很花时间,另一个很多语言提供了进制转换函数,只包括二进制、八进制、十六进制,三进制这种还需要自己写处理逻辑。

3. Python3

  1. class Solution:
  2. def isPowerOfThree(self, n: int) -> bool:
  3. return n > 0 and 1162261467 % n == 0
  4. if __name__ == "__main__":
  5. inputs = [0, 1, 3, 9, 27, 33, 54, 81]
  6. s = Solution()
  7. for i in inputs:
  8. print(i, s.isPowerOfThree(i))

4. Java

  1. class Solution {
  2. public boolean isPowerOfThree(int n) {
  3. return n > 0 && 1162261467 % n == 0;
  4. }
  5. public static void main(String[] args) {
  6. Solution s = new Solution();
  7. int inputs[] = new int[]{0, 1, 3, 9, 27, 33, 54, 81};
  8. for (int i: inputs) {
  9. System.out.println(i + " " +s.isPowerOfThree(i));
  10. }
  11. }
  12. }

5. Scala

  1. object Solution {
  2. def isPowerOfThree(n: Int): Boolean = {
  3. return n > 0 && 1162261467 % n == 0
  4. }
  5. def main(args: Array[String]): Unit = {
  6. val inputs = List(0, 1, 3, 9, 27, 33, 54, 81)
  7. inputs.foreach(i => println(i, isPowerOfThree(i)))
  8. }
  9. }

6. Go

  1. import "fmt"
  2. func isPowerOfThree(n int) bool {
  3. return n > 0 && 1162261467 % n == 0
  4. }
  5. func main() {
  6. var inputs = [...]int{0, 1, 3, 9, 27, 33, 54, 81}
  7. for _, e := range inputs {
  8. fmt.Println(e, isPowerOfThree(e))
  9. }
  10. }

7. C

  1. #include <stdio.h>
  2. #include <stdbool.h>
  3. bool isPowerOfThree(int n) {
  4. return n > 0 && 1162261467 % n == 0;
  5. }
  6. main() {
  7. int i;
  8. int a[] = {0, 1, 3, 9, 27, 33, 54, 81};
  9. for (i = 0; i < sizeof(a) / sizeof(int); ++i) {
  10. printf("%d, %d\n", a[i], isPowerOfThree(a[i]));
  11. }
  12. }

8. C++

  1. #include <iostream>
  2. using namespace std;
  3. class Solution {
  4. public:
  5. bool isPowerOfThree(int n) {
  6. return n > 0 && 1162261467 % n == 0;
  7. }
  8. };
  9. int main() {
  10. int inputs[] = {0, 1, 3, 9, 27, 33, 54, 81};
  11. Solution s;
  12. for (int i = 0; i < sizeof(inputs) / sizeof(int); ++i) {
  13. cout << inputs[i] << ", "<< s.isPowerOfThree(inputs[i]) << endl;
  14. }
  15. return 0;
  16. }