Python:寄生数
通常,可以乘以n的正自然数 将最右边的数字移到数字的前面称为n -寄生数。这里n本身是一个一位数的正自然数。例如:4×128205=512820 4×128205=512820 所以128205是一个4-寄生数。不允许使用带前导零的自然数。所以即使 4×025641=102564 4×025641=102564 号码025641不是4-寄生的 赋值:编写一个取自然数的函数。如果给定的自然数是n-寄生数,则函数必须返回值n。否则,函数必须返回值0 我的代码上一个定义parasticnumber在某些情况下不起作用,例如:parasitic142857 n=5,而我的代码返回0Python:寄生数,python,Python,通常,可以乘以n的正自然数 将最右边的数字移到数字的前面称为n -寄生数。这里n本身是一个一位数的正自然数。例如:4×128205=512820 4×128205=512820 所以128205是一个4-寄生数。不允许使用带前导零的自然数。所以即使 4×025641=102564 4×025641=102564 号码025641不是4-寄生的 赋值:编写一个取自然数的函数。如果给定的自然数是n-寄生数,则函数必须返回值n。否则,函数必须返回值0 我的代码上一个定义parasticnumber在
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
因为break离开循环,所以永远无法到达return语句;您的代码只会从函数的末尾脱落,并且不返回任何值
此外,对getal==rotateLeftnumber的双重检查表明循环设计不佳;您应该能够在循环的顶部测试一次,而无需在内部进行第二次检查
修理
您必须处理两种情况:
如果找到与旋转匹配的乘数,请返回该乘数。
如果所有有效乘数都失败,则返回0。
那么,在你放弃之前,你会尝试多少乘数呢?
b您将两个不同的返回语句放在哪里来处理这些情况?我已经编写了一个函数,似乎可以为您的示例完成这项工作
它使用字符串片段的串联,并将其与num进行比较。我认为一个技巧是n只能在2和11之间才能起作用,否则最后的移位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
您的问题已删除中断,这是第一个问题,因为它在返回任何内容之前结束:
if getal==rotateLeft(number):
return count
else:
return 0
我认为您打算使用while-else循环,但如果第一个结果不起作用,则返回0。您需要更改缩进,以使else对齐,而如果没有找到结果,则返回0,而不是if。您还必须添加检查内容的限制,或者如果没有结果,它将永远持续下去
while getal != rotateLeft(number):
count += 1
getal = count * number
if getal == rotateLeft(number):
return (count)
else:
return 0
虽然使用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
这将测试数字是否可以被右旋转得到的数字整除,如果可以,则返回除数//运算符将结果四舍五入到最接近的整数,但我们已经知道结果必须是整数。如果数字是寄生的,则while循环最终将停止,即使不在其中加中断符。我建议不要在这种电流条件下使用while循环,因为如果数字不是寄生的,这将是无限循环 但是我可以证明,如果您在else条件下删除了return,那么您的代码就可以工作。您还可能需要添加rotateLeft和rotateRight的条件:
希望这能有所帮助。如果getal==rotateLeftnumber:break return count:那就永远不会返回count,而上一次循环是可疑的:它会在第一次迭代时返回或中断,我会用所有值得到0。你发了正确的代码吗?关于@Lien,但我不认为179487是4寄生的。我认为你的else:return 0在第一次计数后停止循环。因此,它无法达到预期的输出。这是因为在第一次计数时,0 x数字显然不是寄生的,所以它会立即返回0。@Jean-Françoisfar correct;这不是一次性逻辑错误。你的意思是什么?@Lien单击答案旁边0上方的箭头,并单击同一位置的灰绿色箭头:现在接受任何答案都为时过早。对于这个问题,根本不需要循环。看这个。另外,你不应该一遍又一遍地计算strnum[-1]+strnum[:-1]。绝对不需要任何循环。
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
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