繁体   English   中英

镜子素发生器python

[英]mirror prime generator python

我目前正在参加一个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次

还有一些错误。 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

更短的版本

您应该尽量避免使用重复的代码。 nmirror_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]

你必须考虑你希望你的功能做什么。 据我所知,函数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实际上返回了正确的结果,但这似乎是你的整个任务所以我不会给你那个。

这是我编辑后的代码,它现在做了我想做的事,感谢大家的帮助

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)

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

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到限制和第二线路简单地返回素数的元素只有如果在素数的反射镜。

简单干净!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM