通常,可以乘以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
答案 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
只能在2
和11
之间才能发挥作用,否则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
,我可能会证明您的代码有效。此外,您可能还想添加rotateLeft
和rotateRight
的条件:
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 强>
您必须处理两种情况:
那么(a)你放弃之前尝试了多少乘数?
(b)你在哪里放两个不同的return
陈述来处理这些案件?