找出a是否是b的幂

时间:2011-01-19 18:03:36

标签: python

我目前正在使用singpath.com练习我的python,但我遇到了一个问题:

数字a是b的幂,如果它可被b整除,a / b是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 

以上是我的解决方案,但系统提示我概括我的解决方案。 谁能告诉我我的解决方案有什么问题?

16 个答案:

答案 0 :(得分:8)

原始代码不起作用的原因如下:您只需检查(c%b) == 0)又名(a/b) is divisible by b,它比定义的a/b is a power of b部分弱得多。

如果你想解决这样的问题,你应该始终从琐碎的案例开始。在这种情况下,有两种情况:is_power(x,x)is_power(1,x) - 答案都是True,因为x**1==xx**0==1

一旦涵盖了这些案例,您只需要记下定义的其余部分。编写(a is divisible by b) and (a/b is a power of 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>

唯一的问题是如何回答<a/b is a power of b>。最简单的方法是使用函数is_power本身 - 这称为递归。

答案 1 :(得分:1)

您只检查前两个权力:a除以b而a / b除以b。它可能是a = b ** 3或b ** 4(或一般b ** n),因此实际解决方案必须涉及递归或循环。

答案 2 :(得分:0)

我不想说概括它。我会说要纠正它,因为它是不正确的。使用你的解决方案is_power(12,2)和is_power(18,3)一样返回True。

我认为系统说它推广它的原因是它可能对他们的一些测试用例正常工作,而不是其他测试用例。如果它以某种方式进行硬编码(例如,只检查2的幂),那么它正在运行的测试用例很可能是那些可以工作的测试用例。

答案 3 :(得分:0)

您正在检查a/b是否可以被 b整除(在表达式(c%b) == 0中),而不是a/b是否为< em> b的力量。 提示:您会调用什么函数来查看某些内容是否具有b的强大功能?

答案 4 :(得分:0)

要理解递归,首先需要了解递归。

 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!

请注意,对于整数a / b,将为您提供舍入错误。确保你通过花车。

答案 5 :(得分:0)

我认为你没有正确的实施方式。根据问题,is_power函数看起来像这样:

def is_power(a,b):
    if a%b == 0 and is_power(float(a)/float(b), b):
        return True
    else:
        return False

答案 6 :(得分:0)

您可以使用日志。

import math

def is_power(a, b):
    return math.log(a, b) % 1 == 0

答案 7 :(得分:0)

def is_power(a,b):
    if a == b:
        return True
    if a % b == 0 and is_power(a/b,b):
        return True
    return False

a == b的结束条件在这里至关重要,当两个数字相等时停止。如果不包含这个,那么即使是合法的数字,函数也可以显示False,方法是在下一次迭代中除以a / b,得到1,其中1%b = 1,然后返回False而不是True。

答案 8 :(得分:0)

您正在回答第一个约束,但不回答第二个约束,
您检查(a/b)%b == 0,这是“(a/b) is a power of b”的特例。 因此,泛化错误(试着想一下这种具体情况。

您撰写的内容不是is power of的解决方案,例如,您将12表示为2的强大功能,因为:{/ p>

  • 12%2 = 0
  • (12/2)%2 = 0

但这显然是错误的。

正如其他人所说,考虑递归(或不太优选的循环解决方案)。

答案 9 :(得分: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,因此bzero时我们必须例外。

另一个例外是b = 1。由于b=1a/ba时,我们最终会得到无限递归。

所以,把它们放在一起:

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))

答案 10 :(得分:0)

此示例应解决您的问题:

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

答案 11 :(得分:0)

这是我的解决方案。

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

我测试了几个案例(16,2),(6,2),(1,2),(0,0),(0,1)并且效果很好。

答案 12 :(得分:0)

更简单的解决方案是:

def is_power(a, b):
    while a % b == 0:
        a //= b
    return a == 1

此问题确实不需要递归。此外,如果a = b ** 1001,则重写可能会导致递归限制错误。

答案 13 :(得分:0)

def is_power(a,b):
'''this program checks if number1 is a power of number2'''

if (a<b):  # lesser number isn't a power of a greater number
    return False
elif (b==0) or (b==1) : # Exception cases
    return False
elif a%b == 0 and is_power(a/b, b) == True:  # Condition check for is_power (Recursion!)
    return True
else:
    return False

答案 14 :(得分:0)

我希望这行得通,这对我来说很好。

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

答案 15 :(得分:-1)

您的解决方案是正确的,但您只需删除if语句中的所有括号。

def ab(a,b):     c = b / a     如果%b == 0且c%b == 0:         返回True     其他:         返回False

print(ab(32,2))