Python 找出a是否是b的幂
我目前正在使用singpath.com在python上进行练习,但我面临一个问题: 如果一个数字A可以被b整除,并且A/b是b的幂,那么A就是b的幂。 编写一个名为is_power的函数,该函数接受参数a和b,如果a是b的幂,则返回TruePython 找出a是否是b的幂,python,Python,我目前正在使用singpath.com在python上进行练习,但我面临一个问题: 如果一个数字A可以被b整除,并且A/b是b的幂,那么A就是b的幂。 编写一个名为is_power的函数,该函数接受参数a和b,如果a是b的幂,则返回True def is_power(a,b): c = a/b if (((a%b) == 0) and ((c%b) == 0)): return True else: return False 以上是我的
def is_power(a,b):
c = a/b
if (((a%b) == 0) and ((c%b) == 0)):
return True
else:
return False
以上是我的解决方案,但系统提示我推广我的解决方案。
有人能告诉我我的解决方案有什么问题吗?我不想概括它。我要说的是纠正它,因为它是不正确的。使用您的解决方案is_power(12,2)返回True,is_power(18,3)返回True
我认为,系统之所以说要推广它,是因为它可能在一些测试用例中正常工作,但在其他测试用例中则不然。它正在工作的测试用例很可能恰好是那些如果以某种方式硬编码(例如,仅检查2的幂)它将工作的测试用例。您只检查前两个幂:a除以b和a/b除以b。可能是a=b**3或b**4(或通常是b**n),因此实际的解决方案必须涉及递归或循环。您要检查
a/b
是否可被b
整除(在表达式(c%b)==0
),而不是a/b
是否是b
的幂提示:您将调用什么函数来查看某事物是否是b
的幂?要理解递归,首先需要理解递归
def is_power(a, b):
if a < b: # 3 is never a power of 10, right?
return False # prevent recursion
if a == b: # a is always a**1, right?
return True # prevent recursion
else:
return is_power(a / b, b) # recursion!
def为动力(a、b):
如果a
请注意,对于整数
a/b
,将出现舍入错误。确保通过浮动。我认为您没有正确的实现。基于此问题,is\u power
功能应如下所示:
def is_power(a,b):
if a%b == 0 and is_power(float(a)/float(b), b):
return True
else:
return False
原始代码不起作用的原因如下:您只需检查
(c%b)=0
aka(a/b)可被b
整除,这比a/b弱得多,a/b是b的幂
定义的一部分
当你想解决这样一个问题时,你应该总是从小事开始。在这种情况下,有两种情况:是幂(x,x)
和是幂(1,x)
——在这两种情况下,答案都是True
,因为x**1==x
和x**0==1
一旦你涵盖了这些案例,你只需要写下其余的定义。为(a可被b整除)和(a/b是b的幂)
编写代码,并将它们放在一起
最后一个函数如下所示:
def is_power(a,b):
if <trivial case 1> or <trivial case 2>:
return True
# its a recursive definition so you have to use `is_power` here
return <a is divisible by b> and <a/b is a power of b>
def为动力(a、b):
如果或:
返回真值
#这是一个递归定义,所以这里必须使用'is_power'
返回和
剩下的唯一问题是如何回答
。做到这一点最简单的方法是使用函数is\u power
本身-这称为递归。您可以使用log
def is_power(a, b):
if a < b: # 3 is never a power of 10, right?
return False # prevent recursion
if a == b: # a is always a**1, right?
return True # prevent recursion
else:
return is_power(a / b, b) # recursion!
import math
def is_power(a, b):
return math.log(a, b) % 1 == 0
当两个数相等时,终止条件a==b在这里是至关重要的。如果未包含此项,则该函数在下一次迭代中将a/b除以1,其中1%b=1,则返回False而不是True,从而对合法数字显示False。您回答的是第一个约束,而不是第二个约束,
您可以检查
(a/b)%b==0
,这是“(a/b)是b的幂”的特例。
因此,泛化错误(尝试泛化该特定案例
您编写的不是解决的方法,而是的幂,例如,您将12
表示为2的幂,因为:
12%2=0
(12/2)%2=0
但这显然是错误的
正如其他人所说,想想递归(或者更不可取的循环解决方案)。我自己也在研究这个问题,这就是我想到的
要将其作为递归函数编写,需要递归部分和平凡部分。对于递归部分,一个数字是另一个数字的幂,如果:
((a%b)==0) and (is_power(a/b, b) # a is evenly divisible by b and a/b is also a power of b.
对于一般情况,b
是a
的幂,如果a=b
但是,我们还没有完成。因为我们正在除以b
,所以我们必须对b
为零的情况例外
另一个例外是当b=1
时。因为当b=1
时,a/b
是a
时,我们将以无限递归结束
def is_power(a, b):
if a < b: # 3 is never a power of 10, right?
return False # prevent recursion
if a == b: # a is always a**1, right?
return True # prevent recursion
else:
return is_power(a / b, b) # recursion!
因此,把所有这些放在一起:
def is_power(a,b):
# trivial case
if (a==b): return True
# Exception Handling
if (b==0) or (b==1): return False # unless a==b==0 or a==b==1, which are handled by the trivial case above
# recursive case
return ((a%b)==0) and (is_power(a/b,b))
此示例将解决您的问题:
def is_power(a,b):
if a == 1:
return True
elif a%b == 0 and is_power(a/b, b) == True:
return True
else:
return False
这是我的解决办法
def is_power(a,b):
if a == 1: # base case for recursion
return True
elif b == 0 or a%b !=0 or a<b: # exception cases.
return False
return is_power(a//b,b) # recursion
def为动力(a、b):
如果a==1:#递归的基本情况
返回真值
如果b==0或a%b!=0或a一个更简单的解决方案是:
def is_power(a, b):
while a % b == 0:
a //= b
return a == 1
此问题实际上不需要递归。此外,如果a=b**1001,递归可能会导致递归限制错误。您的解决方案是正确的,但是您只需要删除if语句中的所有括号
def ab(a、b):
c=b/a
如果a%b==0和c%b==0:
返回真值
其他:
返回错误
打印(ab(32,2))def是电源(a,b):
''此程序检查number1是否为number2的幂''
如果(a我希望这个能起作用,那么这个对我来说很好
import math # I will use the math module for the next function
def is_power (a, b):
if b == 1 and a!= 1:
return False
if b == 1 and a == 1:
return True
if b == 0 and a!= 1:
return False
power = int (math.log(a, b) + 0.5)
return b ** power == a
是的,我应该包括一个b==0
检查。而且每个正数都是任何正数的浮点幂…所以你不能使用浮点数。你不能使用分数,但你必须使用浮点数来获得Python 2.x中的非舍入除法语义(幸运的是,在3.x3/2
==1.5,不再是1)舍入错误将导致不正确的答案,我尝试:)要添加更复杂的内容,您可以使用divmod
获得t