gpt4 book ai didi

python - Python 中的回文/素数检查器不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:13:59 25 4
gpt4 key购买 nike

我的任务是:

What is the only (double-digit, or above) Prime number that is palindromic in both base-2 (binary), and base-10 (decimal) instances?

每当我运行这段代码时,什么也没有发生,它就像一个无限循环。我做错了什么,或者我该如何改进?非常感谢。

def isPrime(n):
if type(n) != int or n <= 1:
return False
elif n == 2:
return True
elif n%2 == 0:
return False
else:
for x in range(2, int(n**0.5)+1):
if n%x == 0:
return False
break
return True
def isPalindrome(x):
num = str(x)[::-1]
if str(x) == num:
return True
else:
return False
while True:
a = 11
if isPrime(a) and isPalindrome(a) == True:
if isPalindrome(bin(a)) == True:
print a
break
else:
a+=2
print a

-------- 编辑:**已解决** --------

修改后的代码:

def isPrime(n):
if n < 2 or n%2 == 0:
return False
if n == 2:
return True
else:
for x in range(3, int(n**0.5)+1, 2):
if n%x == 0:
return False
return True
def isPalindrome(x):
num = str(x)[::-1]
return str(x) == num
a = 11
while True:
if isPrime(a) and isPalindrome(a) and isPalindrome(format(a, "b")):
print a
break
a+=2

感谢所有提供答案的人。

最佳答案

bin() 的输出永远不是回文,因为字符 0b放在它前面:

>>> bin(3)
'0b11'
>>> isPalindrome(bin(3))
False

要么将这两个字符切片,要么使用 format()生成二进制表示:

>>> format(3, 'b')
'11'
>>> isPalindrome(format(3, 'b'))
True

您的循环还有另一个问题:如果您发现一个不是基数为 2 的回文素数,它不会递增:

if isPrime(a) and isPalindrome(a) == True:
if isPalindrome(format(a, 'b')) == True:
print a
break
# no else here
else:
a+=2
print a

只需在一次测试中测试所有条件:

if isPrime(a) and isPalindrome(a) and isPalindrome(format(a, 'b')):
print a
break
a += 2

很少需要测试 == True在 bool 测试中。

接下来是您重置 a在循环中:

while True:
a = 11

你对a做什么并不重要在循环的其余部分,在顶部返回到 11。将其移出循环:

a = 11
while True:
if isPrime(a) and isPalindrome(a) and isPalindrome(format(a, 'b')):
print a
break
a += 2

每当你写if comparison: return True其次是 else: return False只返回测试:

def isPalindrome(x):
num = str(x)[::-1]
return str(x) == num

因为 ==比较运算符已经返回一个 bool 值。

您的素数测试不需要测试 n 的类型,真的(你只传递整数),但是测试类型的正确方法是使用:

isinstance(n, int)

因为这允许 int 的子类也。即使您确实需要将某些内容限制为非常特定的类型并且不允许子类,您也可以使用:

type(n) is int

因为类型是单例。

听取 isPrime Function for Python Language 的建议你的isPrime()如果你使用函数会更快一些:

def isPrime2(n):
if n < 2: return False
if n == 2: return True
for i in range(3, int(n ** 0.5) + 1, 2): # only odd numbers
if n % i == 0:
return False
return True

相反。

您的循环可以通过限制您查看的值的数量来提高效率。如果您查看 Palindronic Prime series在 OEIS 上,您会看到除了 11 之外,所有 以 10 为基数的回文素数都有奇数位数,因此您可以跳过大量数字。以下将产生更好的候选人:

def palindromic_candidates():
yield 11
outer = 1
while True:
for i in range(10):
yield int('{}{}{}'.format(outer, i, str(outer)[::-1]))
outer += 1

演示:

>>> from itertools import islice
>>> pc = palindromic_candidates()
>>> list(islice(pc, 30))
[11, 101, 111, 121, 131, 141, 151, 161, 171, 181, 191, 202, 212, 222, 232, 242, 252, 262, 272, 282, 292, 303, 313, 323, 333, 343, 353, 363, 373, 383]
>>> list(islice(pc, 100, 130))
[13931, 14041, 14141, 14241, 14341, 14441, 14541, 14641, 14741, 14841, 14941, 15051, 15151, 15251, 15351, 15451, 15551, 15651, 15751, 15851, 15951, 16061, 16161, 16261, 16361, 16461, 16561, 16661, 16761, 16861]

用这个代替你的 while True循环,删除 a += 2行:

for a in palindromic_candidates():
if isPrime(a) and isPalindrome(format(a, 'b')):
print a
break

当生成器生成回文时,您可以在其中放弃对 base-10 回文的测试。

关于python - Python 中的回文/素数检查器不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23031804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com