我正在尝试从给定的限制中找到循环素数的数量。素数(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))
答案 0 :(得分:3)
您的代码存在一些问题:
您的prime
函数有错误:
In [8]: prime(1)
Out[8]: True
由于True
为空且range(2, n)
而导致任何小于2的数字错误地返回any([]) == True
。
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) ```