|
发表于 2019-10-10 12:21:56
|
显示全部楼层
令 3^k = n,若 n 是整数,则 n ∈ N* 且 k ∈ N
1. 若 n = 3^k, k ∈ N,则 n 的三进制必是以下之一:1, 10, 100, ... ;问题就转换成了 n 的三进制是否是 1, 10, 100, ...
- def f254(n):
- while n > 1:
- if n % 3 != 0:
- break
- n /= 3
- return n == 1
复制代码
2. 从 3^0 = 1 开始反推
- def f254(n):
- t = 1
- while t < n:
- t *= 3
- return t == n
复制代码
3. 3^k1 % 3^k2 = 0, 0 <= k2 <= k1 且 k1, k2 ∈ N
11,6226,1467=3^19 < 0x7fff ffff < 3^20 => 32 位有符号整型范围内 k1 最大可取 19
- def f254(n):
- return n > 0 and 1162261467 % n == 0
复制代码
4. log(n)/log(3) = log(3^k)/log(3) = klog(3)/log(3) = k
- from math import log
- def f254(n):
- if n < 1:
- return False
- tmp = log(n) / log(3) # tmp = log(n, 3) 也行
- return abs(round(tmp) - tmp) < 1e-10 # 精度原因,要加上这句
复制代码 |
|