【问题标题】:python - finding circular prime numberpython - 找到循环素数
【发布时间】:2023-03-19 10:23:02
【问题描述】:

我试图从给定的限制中找到循环素数的数量。 prime(x) 将返回一个数字是否为素数。 rotations() 将返回一个旋转数字列表。最后, prime_count() 将根据给定的限制输出循环素数的总数。 prime() 和 rotations() 都给了我正确的输出;然而, 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))

【问题讨论】:

  • 您是否尝试在 prime_count 中打印任何内容以查看您的变量/数据在其中做什么?
  • 考虑一下如果您的初始数字包含数字 8 会发生什么。您对至少其中一个轮换有何看法?您可以对其他数字进行相同的观察,这将帮助您减少必须进行的素数测试。

标签: python primes


【解决方案1】:

您的代码存在一些问题:

  1. 您的prime 函数有错误:

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

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

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

【讨论】:

    【解决方案2】:

    这是问题的核心:

    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 内置函数都是变量的错误名称。

    【讨论】:

      【解决方案3】:

      问题可能出在这里:

       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)

      【讨论】:

        【解决方案4】:
            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) ```
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-01-08
          • 2013-01-17
          • 2016-04-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多