python-3.x 有些测试是通过的,但我需要得到输出以下错误的测试:3263应等于-1

8xiog9wr  于 2023-01-10  发布在  Python
关注(0)|答案(3)|浏览(129)

你能解释一下这里有什么问题吗?在我看来,这段代码就像一堆垃圾,但有正确的解决方法。我请你原谅我的英语。这个角色的任务:
有些数字有一些有趣的特性。例如:

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

如果是,我们将返回k,如果不是,返回-1。
注:n,p总是严格的正整数。
dig_pow(89, 1)应返回1,因为8 ¹ +9 ² = 89 = 89 * 1
dig_pow(92, 1)应返回-1,因为没有k,例如9 ¹ +2 ²等于92 * k
dig_pow(695, 2)应返回2,因为6平方+9立方+5立方= 1390 = 695 * 2
dig_pow(46288, 3)应返回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

e4yzc0pl

e4yzc0pl1#

我不知道你用的是哪个版本的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

主要的问题是,在你的目标中,你只有两个返回选项,但是你写了if elif else,这肯定是不必要的,而且会导致问题和bug。
另外,使用if而在另一个分支中不返回任何东西通常不是一个好主意(请参阅assert部分)。当然,如果您不喜欢它,可以回到if

rdrgkggo

rdrgkggo2#

我相信这可以工作以及我发现它更容易阅读一点,但它肯定可以改进:

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
1szpjjfi

1szpjjfi3#

这是一个简单的例子:

digits = (int(i) for i in str(n))

我选择使用这个版本,因为我仍然是一个初学者,这可以用这个alt方式:

result = 0

for digits in str(n):
    #iterate through each digit from n
    # single of digits turn to int & power to p
    for number in digits: 
        result += int(number) ** p
        p += 1

至于完整的解决方案,它是这样的:

def dig_pow(n, p):
    # example n = 123 , change it to string = 1, 2, 3
    # each string[] **p, and p iterate by 1
    # if n % p not equal to p  return - 1

result = 0

for digits in str(n):

    #iterate through each digit from n
    # single digit turn to int & power to p
    for number in digits: 
        result += int(number) ** p
        p += 1  
        
if result % n:
    return -1
else:
    return result // n

相关问题