在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哎呀,我的坏消息:D
x
必须在这里限制大小:对于
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.