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

初始代码

这个代码思路很普通,先判断范围内的每一个数是否是素数。如果是素数,再判断其循环之后的各个数是否是素数,如果全部都是素数 ,count+1,如果有一个不是直接退出判断其他数。
提交时显示超出时间限制,只能通过一个样例。后面我对代码进行优化之后通过了所有样例。


import math

def is_primer(x):    #筛选素数
    for i in range(2, int(math.sqrt(x))+1):
        if x % i == 0:
            break
    else:
        return True
    return False

n = int(raw_input())
count = 0
for x in range(2, n):
    l = 0
    tx = x
    flag = 0
    if is_primer(x):
        while tx != 0:  #记录当前素数的位数
        tx /= 10
        l += 1
        #print x
        flag = 1
        temp = 0
        init = x
        while temp != init:
            i = x / 10
            j = x % 10
            temp = j * (10 ** (l - 1)) + i
            #print temp

            if is_primer(temp):
                flag = 1
                x = temp
            else :
                flag = 0
                break

        if flag == 1:
            count += 1
print count   

优化代码

根据上述问题我又仔细想了一下,发现确实有很大的空间进行优化。
当元素的位数是两位以上时,如果其中有 0,2,4,5,6,8,不管这个元素是不是素数,经过循环后,0,2,4,5,6,8肯定会作为个位数,这样的数一定不是素数。可以直接跳过判断。优化后代码如下:

import math

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

n = input()

count = 0
for x in range(2, n):
    s = str(x)
    for i in s:
        if i in ['0', '2', '4', '5','6', '8']:
            break
    else:
        l = 0
        tx = x
        flag = 0

        if is_primer(x):
            t = str(x)
            l = len(t)
            if l == 1:
                count += 1
            else:
                flag = 1
                temp = 0
                init = x
                while temp != init:
                    i = x / 10
                    j = x % 10
                    temp = j * (10 ** (l - 1)) + i

                    if is_primer(temp):
                        flag = 1
                        x = temp
                    else :
                        flag = 0
                        break
            if flag == 1:
                count += 1
print count+2  # +2是因为当元素是一位数的时候把 2,5省略了,在这里要加上

PS

这里有一个使用数组处理的方法也比较好,和大家分享一下。
https://blog.csdn.net/u013216537/article/details/74852913

猜你喜欢

转载自blog.csdn.net/Alisa01/article/details/81516084