在python中,如果不使用模或库,如何检查数字是否为奇数?
我试图在不使用模在python中,如果不使用模或库,如何检查数字是否为奇数?,python,python-2.7,math,python-2.x,Python,Python 2.7,Math,Python 2.x,我试图在不使用模%或任何库,或偶数位计算(&和|)的情况下确定一个数字是奇数还是偶数。我相信这与将n提升到某种力量有关,但这就是我的全部: def isOdd(num): return num**2 > 0 这显然不起作用。您可以将-1提高到n的幂,然后查看数字是1还是-1: def isOdd(num): if type(num) not in [int, long]: return False if ((-1)**num) == 1:
%
或任何库,或偶数位计算(&
和|
)的情况下确定一个数字是奇数还是偶数。我相信这与将n
提升到某种力量有关,但这就是我的全部:
def isOdd(num):
return num**2 > 0
这显然不起作用。您可以将
-1
提高到n
的幂,然后查看数字是1
还是-1
:
def isOdd(num):
if type(num) not in [int, long]:
return False
if ((-1)**num) == 1:
return False
return True
因此:
>>> isOdd(5.2)
False
>>> isOdd(5)
True
>>> isOdd(6)
False
或者,您可以检查数字是否为浮点数,如果不是,则可以查看最后一位数字是否为奇数:
def isOdd(num):
if type(num) not in [int, long]:
return False
if str(num)[-1] in "13579":
return True
return False
您还可以检查num/2
是浮点还是整数:
def isOdd(num):
return not (num/2.0).is_integer() and type(num) in [int, long]
使用按位AND 编辑:在python3中不按位编辑:
def isOdd(num):
return (num / 2) != (num // 2)
一个是真除法(5/2=2.5),另一个是自然除法(5/2=2)。您可以使用:
def isOdd(x):
return x - 2 * (x // 2) == 1
或者(只是开玩笑)
导入数学
def isOdd(x):
返回math.cos(x*math.pi)<0
还有两种方法:
def is_odd_1(x):
return int(x / 2.) != x / 2.
def is_odd_2(x):
return x // 2 != x / 2.
为什么要避免模运算?为什么现在要避免位运算?!我的猜测是“因为作业上这么说”。你考虑过整数除法吗?或者这也是不允许的?
str(num)[-1]在“13579”
中?@Teepeemm也是我的想法。当然,具有正平方的任何数字都不是奇数!这是一个很好且非常典型的解决方案,但您应该更好地解释。位操作是新开发人员常见的困惑源。我不能使用位计算。问题已被标记。您可以通过执行(num/2.)将解决方案转换为Python 2!=(num//2)
。//运算符已经存在了很长一段时间,而2.
(注意小数点)强制进行浮点除法。我不能使用逐位计算。我喜欢math.cos
解决方案,但浮点相等性测试让我有点紧张。如果将其拼写为math.cos(x*math.pi)<0
,它将为更大范围的输入提供正确的结果。(如前所述,当我的机器上出现x=25211263
时,它会失败,但那只是我的机器:第一个失败点将取决于系统数学库中如何实现cos
)这更像是一种滑稽的解脱:)是的,整个问题都是愚蠢的解决方案。我建议:sum(map(int,('1'*x)。replace('11','00'))==1
Typechecking那样会引起问题;例如,在Python2中,您的第一个代码给出了isOdd(10000000000000000001)=False
@DSM修复了long
和int
checkingNo,它不是。。老实说,我认为这里的打字是不必要的噪音。如果你真的在意,那么传统的做法是抛出一个TypeError而不是默默地返回False,这将导致isOdd(3.0)为False。第一个解决方案现在为isOdd(5)
提供False
。即使您进行了类型检查,也可能不想将num
的类型与字符串'int'
和'long'
:-)进行比较@MarkDickinson哎呀,我的坏消息:Dx
必须在这里限制大小:对于10**16+1
(或2**53+1
)的输入,这两个函数都给出了False
。
def isOdd(x):
return x - 2 * (x // 2) == 1
import math
def isOdd(x):
return math.cos(x * math.pi) < 0
def is_odd_1(x):
return int(x / 2.) != x / 2.
def is_odd_2(x):
return x // 2 != x / 2.