找到除数:代码战

时间:2017-06-20 22:07:12

标签: python

CodeWars问题:

  

创建一个名为divisors的函数,它接受一个整数并返回一个   包含所有整数除数的数组(1和数字除外)   本身)。如果数字是素数返回字符串'(整数)是素数'

当我在Spyder3 for Python中测试它时,下面的代码运行得很好。

def divisors(integer):
    arr = []
    for x in range(2,integer - 1): #if integer is 12
        if integer % x == 0:
            arr.append(x)

    if len(arr) == 0:
        print(integer, 'is prime')
    else:    
        print(arr) 

但是,当我将其提交给CodeWars时,它会返回以下错误。

divisors(15)应该返回[3,5];我的功能就是这样。 CodeWars窗口日志显示答案是正确的,但继续说None should equal [3, 5]

我检查了它是否返回了除列表之外的东西,但是检查了。有人能发现问题吗?

3 个答案:

答案 0 :(得分:3)

网站希望您从函数中返回一个值 - 只需打印它:

if len(arr) == 0:
    return str(integer) + ' is prime'
else:    
    return arr

答案 1 :(得分:1)

您的函数返回None - 没有return语句,没有返回值。函数的默认返回值是None,因此会出现错误消息。

def divisors(integer):
    arr = []
    for x in range(2,integer - 1): #if integer is 12
        if integer % x == 0:
            arr.append(x)

if len(arr) == 0:
    return str(integer) + ' is prime'
else:    
    return arr

for i in [1, 3, 9, 12, 64]:
    print (i, divisors(i))

输出:

1 1 is prime
3 3 is prime
9 [3]
12 [2, 3, 4, 6]
64 [2, 4, 8, 16, 32]

答案 2 :(得分:1)

对您的问题元答案 ...

由于每个其他答案都解决了(明显的)主要问题,我想对现有算法进行改进(因为这是代码大战)。 This link将解释此代码的工作原理。

def divisors(integer):
    arr = []
    for x in range(2, round(integer ** 0.5)): #if integer is 12
        if integer % x == 0:
            arr.append(x)

    if len(arr) == 0:
        return str(integer) + ' is prime'
    else:    
        return arr 

非素数将只有幅度上的平方根。这为您提供了比O(n)稍微好一点的复杂性,并且对于非常大的输入显着改善了。

现在,您可以通过列表理解来大幅缩短代码。

def divisors(integer):
    arr = [x for x in range(2, round(integer ** 0.5)) if integer % x == 0]

    if len(arr) == 0:
        return str(integer) + ' is prime'

    return arr 

这是做同样的事情,但现在循环已经转移到理解中。 else也是多余的。