python - 查找循环素数

时间:2018-04-05 03:23:30

标签: python primes

我正在尝试从给定的限制中找到循环素数的数量。素数(x)将返回数字是否为素数。旋转()将返回旋转数字列表。最后,prime_count()将根据给定的限制输出循环素数的总量。 prime()和rotation()都给了我正确的输出;但是,prime_count()并没有像它应该的那样递增。关于我做错了什么的想法?

def prime(number): #return true or false
    return all(number% i for i in range(2,number))

def rotations(num): #rotating number and return list
    list = []
    m = str(num)
    counter = 0 
    while counter < len(str(num)):
        m=m[1:] + m[0]
        list.append(int(m))
        counter+=1
    list1=sorted(list,key=int)
    return list1

def prime_count(limit): #return numbers of circular primes from given limit
    counter = 0 

    for i in range(1,limit+1):
        a=rotations(i)
        for j in a:
            if j == prime(j): 
                counter+=1 

    return counter

print(prime_count(100))

4 个答案:

答案 0 :(得分:3)

您的代码存在一些问题:

  1. 您的prime函数有错误:

    In [8]: prime(1)
    Out[8]: True
    

    由于True为空且range(2, n)而导致任何小于2的数字错误地返回any([]) == True

  2. prime_count应计算limit以下的圆形素数总数。 prime(j)返回一个布尔值,但是你检查j == prime(j),只有当j为零或一个时才能为真,这绝对不是你想要的。尝试创建一个is_circular_prime函数,它接受一个整数n并返回素数是否为圆形。然后,prime_count变得容易编写。

答案 1 :(得分:1)

这是问题的核心:

a=rotations(i)
for j in a:
    if j == prime(j): 
        counter+=1

您要计算错误的事物(例如13计数两次,而不是31进行两次计数),并且您正在比较错误的事物(数字与布尔值比较)。问题要比做起来简单。重新排列代码:

def prime(number):
    return number > 1 and all(number % i != 0 for i in range(2, number))

def rotations(num):
    rotated = []

    m = str(num)

    for _ in m:
        rotated.append(int(m))
        m = m[1:] + m[0]

    return rotated

def prime_count(limit):
    counter = 0 

    for number in range(1, limit + 1):

        if all(prime(rotation) for rotation in rotations(number)): 
            counter += 1 

    return counter

print(prime_count(100))

请注意,您无需为此目的对旋转进行排序。另外,list或任何其他Python内置函数对于变量来说都是不好的名字。

答案 2 :(得分:0)

问题可能在这里:

 for i in range(1,limit+1):
        a=rotations(i)
        for j in a:
            if j == prime(j):   # Prime will return True or False, comapring with J will cause it False ,except when J = 1 
                counter+=1 

将其更改为prime(j)

答案 3 :(得分:0)

    for i in range(2,number//2):
        if(number%i==0):
            return False 
    return True  

def rotations(num):
    count=0 
    rotation_lst=[]
    num=str(num)
    while(count<len(num)):
        num=num[1:]+num[0]
        count+=1 
        rotation_lst.append(int(num))
    rotation_lst1=sorted(rotation_lst,key=int)
    return rotation_lst1

def get_circular_prime_count(limit):
    count=0
    for i in range(1,limit+1):
        a=rotations(i)

        for j in a:
            if(check_prime(j)):
                count+=1 
    return count 
print(get_circular_prime_count(1000) ```