下面的代码不适用于某些输入。
a, i = set(), 1
while i <= 10000:
a.add(i)
i <<= 1
N = int(input())
if N in a:
print("True")
else:
print("False")
我最初的想法是检查每个输入是否为2的幂,方法是从1开始乘以2直到超过输入数量,然后在每个步骤进行比较。相反,我set
预先存储了2的所有幂,以便检查中的给定输入O(1)
。如何改善呢?
将 _ 最好的,最准确_ 的方法是使用位操作:
(n & (n-1) == 0) and n != 0
说明:
2的每个幂将1位恰好设置为1(该数的对数以2为底的索引中的位)。因此,当从中减去1时,该位翻转为0,而所有在前位翻转为1。这使这2个数字互为逆,因此对它们进行“与”运算时,结果将为0。
例如:
n = 8
decimal | 8 = 2**3 | 8 - 1 = 7 | 8 & 7 = 0
| ^ | |
binary | 1 0 0 0 | 0 1 1 1 | 1 0 0 0
| ^ | | & 0 1 1 1
index | 3 2 1 0 | | -------
0 0 0 0
-----------------------------------------------------
n = 5
decimal | 5 = 2**2 + 1 | 5 - 1 = 4 | 5 & 4 = 4
| | |
binary | 1 0 1 | 1 0 0 | 1 0 1
| | | & 1 0 0
index | 2 1 0 | | ------
1 0 0
因此,总而言之,每当我们从一个数字中减去一个,然后将结果与数字本身相减,即为0-该数字就是2的幂!
当然,0
将任何与进行AND运算都会得到0,因此我们添加的校验n != 0
。
您总是可以使用一些math
函数,但是这些函数的准确性较差:
import math
math.log(n, 2).is_integer()
要么:
math.log2(n).is_integer()
n <= 0
函数,两个函数都将抛出a,ValueError
因为它在数学上是未定义的(因此不应出现逻辑问题)。要么:
abs(math.frexp(n)[0]) == 0.5
还应该指出的是,对于某些数字,这些功能不准确,实际上给出了 假结果 :
math.log(2**29, 2).is_integer()
会给 False
math.log2(2**49-1).is_integer()
会给 True
math.frexp(2**53+1)[0] == 0.5
会给True
!这是因为math
函数使用浮点数,而这些浮点数具有固有的精度问题。
根据数学文档,log
具有给定基数的,实际上会计算出log(x)/log(base)
这显然很慢。log2
据说更准确,甚至可能更有效。位操作是简单的操作,不调用任何函数。
结果是:
log
与base=2
:0.67秒
frexp
:0.52秒
log2
:0.37秒位操作:0.2秒
我用于这些措施的代码可以在此REPL中重新创建。
我正在准备面试,遇到了这个问题: 编写一个程序,检查数字n是否为x^y形式。众所周知,n,x和y是整数,x和y大于2。 我想拿日志之类的东西,但不知道如何检查数字是否符合表格。你们谁能帮忙吗?:)
问题内容: 我只是在Firefox的JavaScript控制台中尝试过,但是以下任何语句都不返回true: 问题答案: 试试这个代码:
本文向大家介绍编写Golang程序以检查给定数字是否为质数,包括了编写Golang程序以检查给定数字是否为质数的使用技巧和注意事项,需要的朋友参考一下 定义: 一个数字是大于2且只能被其自身和1整除。 示例:素 数是2、3、5、7、11、13、113、119等。 解决这个问题的方法 步骤1:找到给定数字的平方根sq_root =√num 步骤2:如果给定数字可被[2,sq_root]所属的数字整除
问题内容: 好吧,这是一个复杂的问题,我完全迷失了。 假设您有一个字符串和一个通用类。像这样。 您将如何检查String是否表示该类可以相等的值。 例如,可以这样说: 如何检查字符串“ true”实际上是布尔值? 这是另一个例子。可以这样说: 如何检查字符串“ true”不是整数? 问题答案: 鉴于您只需要 Wrapper Types ,可以在此处使用一些反射技巧(为简洁起见,忽略无关代码的异常处
问题内容: 如何在Java中验证JSON字符串?还是可以使用正则表达式解析它? 问题答案: 一个疯狂的主意,尝试解析它并捕获异常: 该代码使用org.json JSON API实现,该实现在github,maven和部分Android上可用。
问题内容: 检查字符串是否可以在Python中表示为数字的最佳方法是什么? 我目前拥有的功能是: 它不仅丑陋且缓慢,而且看起来笨拙。但是我还没有找到更好的方法,因为调用floatmain函数甚至更糟。 问题答案: 如果您要解析(正数,无符号)整数而不是浮点数,则可以将该isdigit()函数用于字符串对象。 字符串方法- isdigit():Python2,Python3