密码战。一些测试通过了,但我需要得到输出以下错误的测试:3263 应该等于 -1

Codewars. Some tests are passed, but i need to get tests which outputs the following mistake: 3263 should equal -1

你能解释一下这里有什么问题吗?在我看来,这段代码就像一堆废话,但解决方案是正确的。请原谅我的英语。 这个型的任务:

一些数字具有有趣的特性。例如:

89 --> 8¹ + 9² = 89 * 1

695 --> 6² + 9³ + 5⁴= 1390 = 695 * 2

46288 --> 4³ + 6⁴+ 2⁵ + 8⁶ + 8⁷ = 2360688 = 46288 * 51

给定一个正整数n写成abcd...(a,b,c,d...都是数字)和一个正整数p我们要找一个正整数k,如果存在,比如n 的数字与 p 的连续幂的总和等于 k ​​ n。换句话说:

Is there an integer k such as : (a ^ p + b ^ (p+1) + c ^(p+2) + d ^ (p+3) + ...) = n * k

如果是这样我们就returnk,如果不是return-1.

注意:n、p 将始终严格为正整数。

dig_pow(89, 1) 应该 return 1 因为 8¹ + 9² = 89 = 89 * 1

dig_pow(92, 1) 应该 return -1 因为没有 k 例如 9¹ + 2² 等于 92 * k

dig_pow(695, 2) 应该 return 2 因为 6² + 9³ + 5⁴= 1390 = 695 * 2

dig_pow(46288, 3) 应该 return 51 因为 4³ + 6⁴+ 2⁵ + 8⁶ + 8⁷ = 2360688 = 46288 * 51

def dig_pow(n, p):
    if n > 0 and p > 0:
        b = []
        a = str(n)
        result = []
        for i in a:
            b.append(int(i))
            for x in b:
                if p != 1:
                    result.append(x ** p)
                    p += 1
                else:
                    result.append(x ** (p + 1))

        if int((sum(result)) / n) < 1:
            return -1
        elif int((sum(result)) / n) < 2:
            return 1
        else:
            return int((sum(result)) / n)

测试结果:

测试通过

测试通过

测试通过

测试通过

3263 应该等于 -1

我不知道您使用的 Python 的确切版本。以下代码在 Python 3 中。如果我猜对了,代码可以像

一样简单
def dig_pow(n, p):
    assert n > 0 and p > 0
    digits = (int(i) for i in str(n)) # replaces your a,b part with generator
    result = 0 # you don't use result as a list, so an int suffice
    for x in digits: # why do you need if in the loop? (am I missing something?)
        result += x ** p
        p += 1

    if result % n: # you just test for divisibility
        return -1
    else:
        return result // n

主要问题是,在你的objective中,你只有返回两个选项,但你写了if elif else,这绝对是不必要的,会导致问题和错误。 % 是模运算符。

另外,有一个 if 而在另一个分支中不返回任何东西通常不是一个好主意(参见 assert 部分)。当然,如果你不喜欢,就退回到if

我相信这也可以,我发现它更容易阅读,但它肯定可以改进:

def dig_pow(n, p):
    value = 0
    for digit in str(n):
        value += int(digit)**p
        p += 1
    for k in range(1,value):
        if value/k == n:
        return k
    return -1