Python:寄生数

时间:2017-10-30 17:48:03

标签: python

通常,可以乘以n的正自然数 通过将最右边的数字移动到数字的前面,称为n - 寄生数。这里n本身是一位数的正自然数。例如:4×128205 = 512820          4×128205 = 512820 所以128205是一个4寄生数。不允许带有前导零的自然数字。即便如此 4×025641 = 102564 4×025641 = 102564 数字025641不是4寄生的。

作业:写一个寄生的函数,它采用自然数。如果给定的自然数是n寄生,则该函数必须返回值n。否则,该函数必须返回值0。

我的代码(最后定义parastic(number))在某些情况下不起作用,例如:parasitic(142857) n = 5,而我的代码我返回0。

def rotateLeft(number):
    """
    >>> rotateLeft(717948)
    179487
    >>> rotateLeft(142857)
    428571
    >>> rotateLeft(105263157894736842)
    52631578947368421
    """

    k = str(number)
    letter = k[:1]
    numb = k[1:]
    resultaat = str(numb) + str(letter)
    return int(resultaat)



def rotateRight(number):
    """
    >>> rotateRight(179487)
    717948
    >>> rotateRight(428571)
    142857  
    >>> rotateRight(52631578947368421)
    15263157894736842
    """

    k = str(number)
    letter = k[-1]
    numb = k[:-1]
    resultaat = str(letter) + str(numb)  
    return int(resultaat)

def parasitic(number):
    """
    >>> parasitic(179487)
    4
    >>> parasitic(142857)
    5
    >>> parasitic(105263157894736842)
    2
    >>> parasitic(1234)
    0
    """


    count = 0
    getal = count * number

    while getal != rotateLeft(number):
        count += 1
        getal = count * number
        if getal == rotateLeft(number):
            break
            return (count)
        else:
            return 0

5 个答案:

答案 0 :(得分:1)

虽然使用while循环可以提高你对python的掌握,但这可以通过使用%运算符来解决。

def rotateRight(number):
    """
    >>> rotateRight(179487)
    717948
    >>> rotateRight(428571)
    142857  
    >>> rotateRight(52631578947368421)
    15263157894736842
    """
    k = str(number)
    return int(k[-1] + k[:-1])

def parasitic(number):
    rotated = rotateRight(number)
    if not rotated % number:
        return rotated // number
    else:
        return 0

这将测试number是否可以被右旋转获得的数字整除,如果是,则返回除数(//运算符将结果舍入为最接近的整数,但是我们已经知道结果必须是整数)

答案 1 :(得分:0)

我写了function,似乎可以为你的例子做好准备!

它使用concatenation string slices并将其与num进行比较。我认为一个诀窍就是n只能在211之间才能发挥作用,否则1在最后的转变将永远不会产生原始number {1}}。

以下是代码:

def parasitic(num):
    for n in range(2, 11):
        res = n * num
        if str(num)[-1] + str(num)[:-1] == str(res):
            return n
    return False

测试:

>>> parasitic(128205)
4
>>> parasitic(142857)
5
>>> parasitic(105263157894736842)
2
>>> parasitic(35)
False

答案 2 :(得分:0)

你的问题(删除了休息,这是第一个问题,因为它在它可以返回任何内容之前结束):

if getal==rotateLeft(number):
    return count
else:
    return 0

我认为你想要一个while-else循环,但你最终得到了"如果第一个结果不起作用,则返回0"。你需要更改缩进,以便else在while中排队(所以如果没有找到结果,则返回0),而不是if。您还必须添加要检查的内容的限制,或者如果没有结果,它将永远继续。

while getal != rotateLeft(number):
   count += 1
   getal = count * number
   if getal == rotateLeft(number):
        return (count)
else:
   return 0

答案 3 :(得分:0)

如果您的号码是寄生的,即使您没有将while放入其中,break循环也会最终停止。我建议不要在此当前条件下使用while循环,因为如果数字不是寄生的,这将是无限循环。

但是,如果您删除return条件中的else,我可能会证明您的代码有效。此外,您可能还想添加rotateLeftrotateRight的条件:

def parasitic(number):
    count = 0;
    getal = count * number;

    while getal != rotateLeft(number) and getal != rotateRight(number) :
        count += 1
        getal = int(count * number)
        if getal == rotateLeft(number) or getal == rotateRight(number)  :
            print(count); print(getal);
            return (count)
        else:
            pass

希望这有帮助。

答案 4 :(得分:-1)

    if getal == rotateLeft(number):
        break
        return (count)

由于break离开了循环,因此无法访问return语句;你的代码只会从函数的末尾开始,然后返回None

此外,您对getal == rotateLeft(number)的仔细检查表明环路设计不佳;您应该能够在循环顶部测试一次,而无需在其中进行第二次检查。

<强> REPAIR

您必须处理两种情况:

  1. 如果找到与旋转匹配的乘数,则返回该乘数。
  2. 如果所有有效乘数失败,则然后返回0.
  3. 那么(a)你放弃之前尝试了多少乘数? (b)你在哪里放两个不同的return陈述来处理这些案件?