循环素数

最近在MOOC上学习Python,遇到一个求解循环素数的问题,现在来整理一下↓

题目描述

数字197可以被称为循环素数,因为197的三个数位循环移位后的数字:197,971,719均为素数。100以内这样的数字包括13个,2,3,5,7,11,13,17,31,37,71,73,79,97。要求任意正整数n以内一共有多少个这样的循环素数。

输入描述:

一个正整数n。

输出描述:

n以内循环素数的数目。

输入例子:

100

输出例子:

13

题目分析

  • 我觉得这个问题最耗时间的地方在于素数的判断。最开始我采用暴力法求解素数,在n的数量级比较小的时候,这个方法还可以用,但是当n的数量级变大时,就相当耗时了。需要对此做出优化。
  • 优化过程:
  • ①当0,2,4,5,6,8排在个位数时,如果不是10以内的数,就肯定不是素数。因此,只有1,3,7,9这四个数组成的组合数才有可能是循环素数。可以根据这个条件剔除数字中含有0,2,4,5,6,8的数。
  • ②这样循环的步长可以由原来的加1变成加2,即只判断奇数即可。

题目代码

暴力法:

import math
def isPrime(num):
    for i in range(2,int(math.sqrt(num)+1)):
        if num%i==0:
            return False
    return True

n=input()
count=0
for k in range(2,n):
    if isPrime(k):
        t_str=str(k)
        t_len=len(t_str)
        if t_len==1:
            count+=1
        else:
            for t in range(1,t_len):
                t_str=t_str[1:]+t_str[0]
                tmp=int(t_str)
                if not isPrime(tmp):
                    break
            else:
                count+=1
print count

优化后:

import math
def isPrime(num):
    for i in range(3,int(math.sqrt(num)+1),2):
        if not num%i:
            return False
    else:
        return True
    
n=input()
numList = [2,3,5,7]
for num in range(11,n):
    for s in str(num):
        if s in ['0','2','4','5','6','8']:
            break
    else:
        if isPrime(num):
            t_str=str(num)
            t_len=len(t_str)
            for t in range(1,t_len):
                t_str=t_str[1:]+t_str[0]
                tmp=int(t_str)
                if not isPrime(tmp):
                    break
            else:
                numList.append(tmp)

print(len(numList))


相关参考

http://bbs.fishc.com/thread-75774-1-1.html



  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值