Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 找出a是否是b的幂_Python - Fatal编程技术网

Python 找出a是否是b的幂

Python 找出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 以上是我的

我目前正在使用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 
以上是我的解决方案,但系统提示我推广我的解决方案。
有人能告诉我我的解决方案有什么问题吗?

我不想概括它。我要说的是纠正它,因为它是不正确的。使用您的解决方案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.x
3/2
==1.5,不再是1)舍入错误将导致不正确的答案,我尝试:)要添加更复杂的内容,您可以使用
divmod
获得t