我目前正在参加Python编程课程,上周我们有一个作业问题,就是开发一个程序来生成所有素数小于或等于n的镜像也是素数,我看不到我在哪里出了问题,请帮忙!
import math
def mirror_prime(n):
answer = True
# Test 0 and 1
if n==0 or n==1:
answer = False
# End if
# Test even numbers
if n != 2 and n%2==0:
answer= False
# End if
# Test if there is a proper odd divisor
for d in range (3, int(math.sqrt(n))+1, 2):
if n%d==0:
answer=False
# End if
# End for
#Reverse n
mirror_n = int(str(n)[::-1])
mirror_answer = True
# Test 0 and 1
if mirror_n==0 or mirror_n==1:
mirror_answer = False
# End if
def mirror_prime_generator(n):
for i in range(3, n+1):
print (mirror_prime(i))
我期望得到一个所有素数的列表,这些素数的镜像也小于或等于n
当我将mirror_prime_generator(n)放入shell时,我得到的结果是ns打印无数n次,所以如果n是23则不打印23次
答案 0 :(得分:2)
还有一些错误。 for
循环的缩进是错误的(它们位于if
内),有时您使用n
代替mirror_n
。
这是一个变化最小的工作代码:
import math
def mirror_prime(n):
answer = True
# Test 0 and 1
if n==0 or n==1:
answer = False
# End if
# Test even numbers
if n != 2 and n%2==0:
answer= False
# End if
# Test if there is a proper odd divisor
for d in range (3, int(math.sqrt(n))+1, 2):
if n%d==0:
answer=False
# End if
# End for
#Reverse n
mirror_n = int(str(n)[::-1])
mirror_answer = True
# Test 0 and 1
if mirror_n==0 or mirror_n==1:
mirror_answer = False
# End if
# Test even numbers
if mirror_n != 2 and mirror_n%2==0:
mirror_answer= False
# End if
# Test if there is a proper odd divisor
for d in range (3, int(math.sqrt(mirror_n))+1, 2):
if mirror_n%d==0:
mirror_answer=False
# End if
# End for
if answer and mirror_answer==True:
return n, mirror_n
def mirror_prime_generator(n):
for i in range(3, n+1):
if mirror_prime(i):
print(i)
mirror_prime_generator(100)
# 3
# 5
# 7
# 11
# 13
# 17
# 31
# 37
# 71
# 73
# 79
# 97
您应该尽量避免使用重复的代码。 n
和mirror_n
的测试完全相同,因此您可以将其放在函数中:
def is_prime(n):
if n == 2:
return True
if n < 2 or n % 2 == 0:
return False
for d in range(3, int(n**0.5) + 1, 2):
if n % d == 0:
return False
return True
def is_mirror_prime(n):
mirror_n = int(str(n)[::-1])
return mirror_n != n and is_prime(n) and is_prime(mirror_n)
print([n for n in range(1000) if is_mirror_prime(n)])
# [13, 17, 31, 37, 71, 73, 79, 97, 107, 113, 149, 157, 167, 179, 199, 311, 337, 347, 359, 389, 701, 709, 733, 739, 743, 751, 761, 769, 907, 937, 941, 953, 967, 971, 983, 991]
答案 1 :(得分:0)
你必须考虑你希望你的功能做什么。据我所知,函数mirror_prime(n)
回答了问题“既是n又是镜像素数?”,这是一个二元问题(无论是真还是假)。如果是这种情况,这是完全合理的,请重新构建mirror_prime_generator
循环,如下所示:
def mirror_prime_generator(n):
for i in range(3, n+1):
if mirror_prime(i):
print(i)
当然,这是假设mirror_prime
实际上返回了正确的结果,但这似乎是你的整个任务,所以我不会给你那个。
答案 2 :(得分:0)
这是我编辑后的代码,它现在可以做我想做的事,感谢大家的帮助
import math
def mirror_prime(n):
answer = True
# Test 0 and 1
if n==0 or n==1:
answer = False
# End if
# Test even numbers
if n != 2 and n%2==0:
answer= False
# End if
# Test if there is a proper odd divisor
for d in range (3, int(math.sqrt(n))+1, 2):
if n%d==0:
answer=False
# End if
# End for
#Reverse n
mirror_n = int(str(n)[::-1])
mirror_answer = True
# Test 0 and 1
if mirror_n==0 or mirror_n==1:
mirror_answer = False
# End if
# Test even numbers
if n != 2 and n%2==0:
mirror_answer= False
# End if
# Test if there is a proper odd divisor
for d in range (3, int(math.sqrt(mirror_n))+1, 2):
if mirror_n%d==0:
mirror_answer=False
# End if
# End for
if answer and mirror_answer==True:
return n, mirror_n
def mirror_prime_generator(n):
for i in range(3, n+1):
if mirror_prime(i):
print(i)
答案 3 :(得分:0)
我认为定义你所描述的功能的最短方法是:
def mirrorPrimes(limit):
primes = [n for n in range(2,limit+1) if all(n%d!=0 for d in range(2,n))]
return [n for n in primes if int(str(n)[::-1]) in primes]
第一个函数行将 primes 的所有素数从2添加到 limit ,第二行只返回 primes 中的元素是 primes 中的一面镜子。
简单干净!