镜像素数生成器python

镜像素数生成器python,python,math,Python,Math,我目前参加了一个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

我目前参加了一个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


当我把MielOrthPrimeEng生成器(n)放入shell中时,得到的结果是没有打印多少次,n是n,所以如果n是23,它就不会打印23次

< p>你必须考虑你希望你的函数做什么。据我所知,函数
mirror\u prime(n)
回答了“n和它的mirror prime都是吗?”的问题,这是一个二进制问题(真或假)。如果是这种情况(这是完全合理的),请按如下方式重新构造
mirror\u prime\u生成器
循环:

def mirror_prime_generator(n):
    for i in range(3, n+1):
        if mirror_prime(i):
            print(i)

当然,这是假设
mirror\u prime
实际上返回了一个正确的结果,但这似乎是您的全部任务,所以我不会给您这个任务。

这是我编辑后的代码,现在它完成了我希望它完成的任务,谢谢大家的帮助

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)

还有一些虫子。循环的
缩进错误(它们在
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\u 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]
def为素数(n):
如果n==2:
返回真值
如果n<2或n%2==0:
返回错误
对于范围(3,int(n**0.5)+1,2)内的d:
如果n%d==0:
返回错误
返回真值
def为镜像素数(n):
镜像n=int(str(n)[::-1])
返回后视镜n和is_素数(n)和is_素数(镜像)
打印([n表示范围(1000)内的n,如果为镜像素数(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]

我认为定义您描述的函数的最短方法是:

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]
第一个函数行将从2到limit的所有素数放入素数,第二行仅在素数中有镜像时返回素数中的元素


简单干净

您需要使用
return mirror\u answer
返回答案。如果不返回任何内容,则默认值为
None
,这是您随后打印的内容。我将把它放在哪里?当我把它放入第一个def并运行它时,它只打印True或False而不是numbersWell,你的程序中也有一些其他的bug。这是一个很好的练习,可以尝试弄清楚程序为什么会这样做。但首先,您有时会指定一个名为
answer
的变量,有时会指定一个名为
mirror\u answer
的变量。它们应该是一样的。其次,您应该打印
i
(数字),并且仅当
mirror\u prime
返回True时。哦,好的,谢谢,如果我需要打印两个不同的值,我不需要有两个不同的变量吗?素数和镜像素数?也谢谢你的帮助!实际上,一旦你发现一个数字不是素数,你就可以
返回False
,这样做没有意义。但是你可以做所有的测试并使用两个变量,但是你应该
返回answer和mirror\u answer
,只有当
answer
mirror\u answer
都是
时才返回answer和mirror\u answer
。这不是一个好的答案,因为程序还有其他bug,OP想找出更好的结构。如果他只是复制这段代码,它仍然无法实现他想要实现的目标。非常感谢,我终于发现了,编辑后还有一些bug,但这是我自己的愚蠢,因为我忘记了更改某些变量名和其他东西,我不得不在第一个def中更改一些其他东西,就像更改一些if语句和添加更多测试一样,此代码仍然是错误的<如果
,则的code>应在
之外。