【问题标题】:Codewars. Some tests are passed, but i need to get tests which outputs the following mistake: 3263 should equal -1代码战。一些测试通过了,但我需要得到输出以下错误的测试: 3263 应该等于 -1
【发布时间】:2017-07-22 22:28:32
【问题描述】:

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

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

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

【问题讨论】:

    标签: python algorithm python-2.7 python-3.x digit


    【解决方案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
    

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

    此外,拥有if 并且在另一个分支中不返回任何内容通常不是一个好主意(请参阅assert 部分)。当然,如果你不喜欢,直接回if即可。

    【讨论】:

    • 非常感谢!我了解我的代码的所有缺点并修复它。但是除了最后一刻... if result % n: return -1 这个例子中取模运算符的作用是什么?它找不到余数? 'result' 是否不能除以 'n' 并因此输出 'return -1'?
    • 为什么在某些情况下它会从 'if 语句' 传递到 'return -1' 语句?
    • @OlegRadchenko,% 是模运算符,它计算 lhs // rhs 的余数。您可以查看文档here
    • @OlegRadchenko 抱歉,我不太明白。你刚刚在代码中发现了一个错误吗?如果余数为零(隐式 bool false),则返回结果,否则返回 -1。
    • 糟糕透了。我的错。我误解了任务的条款。我认为我需要将结果除以 n 然后接收一个整数。大概像这样: (int(sum(result)) // n)。感谢您的帮助。
    【解决方案2】:

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

    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
    

    【讨论】:

    • 请稍微解释一下;仅代码的答案,即使是正确的,也不能帮助 OP 找出他们做错了什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 2016-02-27
    • 2017-04-01
    • 2020-06-01
    • 2017-04-20
    • 1970-01-01
    • 2012-12-12
    相关资源
    最近更新 更多