题目地址: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
class Solution:def isPowerOfThree(self, n: int) -> bool:return n > 0 and 1162261467 % n == 0if __name__ == "__main__":inputs = [0, 1, 3, 9, 27, 33, 54, 81]s = Solution()for i in inputs:print(i, s.isPowerOfThree(i))
4. Java
class Solution {public boolean isPowerOfThree(int n) {return n > 0 && 1162261467 % n == 0;}public static void main(String[] args) {Solution s = new Solution();int inputs[] = new int[]{0, 1, 3, 9, 27, 33, 54, 81};for (int i: inputs) {System.out.println(i + " " +s.isPowerOfThree(i));}}}
5. Scala
object Solution {def isPowerOfThree(n: Int): Boolean = {return n > 0 && 1162261467 % n == 0}def main(args: Array[String]): Unit = {val inputs = List(0, 1, 3, 9, 27, 33, 54, 81)inputs.foreach(i => println(i, isPowerOfThree(i)))}}
6. Go
import "fmt"func isPowerOfThree(n int) bool {return n > 0 && 1162261467 % n == 0}func main() {var inputs = [...]int{0, 1, 3, 9, 27, 33, 54, 81}for _, e := range inputs {fmt.Println(e, isPowerOfThree(e))}}
7. C
#include <stdio.h>#include <stdbool.h>bool isPowerOfThree(int n) {return n > 0 && 1162261467 % n == 0;}main() {int i;int a[] = {0, 1, 3, 9, 27, 33, 54, 81};for (i = 0; i < sizeof(a) / sizeof(int); ++i) {printf("%d, %d\n", a[i], isPowerOfThree(a[i]));}}
8. C++
#include <iostream>using namespace std;class Solution {public:bool isPowerOfThree(int n) {return n > 0 && 1162261467 % n == 0;}};int main() {int inputs[] = {0, 1, 3, 9, 27, 33, 54, 81};Solution s;for (int i = 0; i < sizeof(inputs) / sizeof(int); ++i) {cout << inputs[i] << ", "<< s.isPowerOfThree(inputs[i]) << endl;}return 0;}
