欧拉工程第35题:Circular primes

题目链接:https://projecteuler.net/problem=35
求100万以下循环质数的个数。
注意:97, 79是两个循环质数
下面是两个有点不一样的方法:
方法一:判断这个数是不是质数,如果是,在判断是不是循环质数。
方法二:先把100万以下的质数存在布尔型数组中,是质数是true,再对每个数判断循环质数

两个时间都是差不多的在600ms左右
java代码:

package projecteuler31to40;

import java.util.Date;
import java.util.Set;
import java.util.TreeSet;
class level35o{
    void solve(){
        int Max_Value=1000000;
        int num=0;
        int result=4;//2 3 5 7
        boolean[] IsPrime=new boolean[Max_Value];
        IsPrime[2]=true;
        for(int i=3;i<Max_Value;i=i+2){
            IsPrime[i]=isPrime(i);
        }
        for(int i=11;i<Max_Value;i=i+2){
            num=i;
            int len=String.valueOf(num).length();
            while( num<Max_Value  && IsPrime[num]==true && len>0){
                num=Rotation(num);
                len=len-1;
            }
            if(len==0) {
                result+=1;
// System.out.println(i);
            }

        }
        System.out.println(result);


    }
    int Rotation(int num){
        int end=num%10;
        int before=num/10;
        int len=String.valueOf(num).length();
        int rot=(int) (Math.pow(10, len-1)*end+before);
        return rot;
    }
    boolean isPrime(int num){
        for(int i=2;i<=Math.sqrt(num)+1;i++){
            if(num%i==0)
                return false;
        }
        return true;
    }
}
class level35{
    void solve(){
        Set<Integer> set=new TreeSet<Integer>();
        set.add(2);
        for(int i=3;i<1000000;i=i+2){
            if(isPrime(i)){

                if(isCirclPrime(i)){
                    set.add(i);
// System.out.println(i);
                }   
            }
        }
        System.out.println(set.size());
    }
    boolean isPrime(int num){
        for(int i=2;i<=Math.sqrt(num);i++){
            if(num%i==0)
                return false;
        }
        return true;
    }
    boolean isCirclPrime(int num){
        String str=String.valueOf(num);
        int len=str.length();
        int prime;
        for(int i=1;i<len;++i){
            str=RotationString(str);
            prime=Integer.parseInt(str);
            if(isPrime(prime)==true){
            }else{
                return false;
            }
        }
        return true;
    }
    //顺时针旋转一次
    String RotationString(String str){
        String tmp=str.substring(1)+str.charAt(0);
        return tmp;
    }
}
public class Problem35 {

    public static void main(String[] args){
        Date beginTime=new Date();
        new level35().solve();
        Date endTime=new Date();
        Long Time=endTime.getTime()-beginTime.getTime();
        System.out.println("Time="+Time/1000+"秒"+Time%1000+"毫秒");
    }
}

Python代码:

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

def Primes(n):
    array=[True]*n
    for i in range(3,n):
        array[i]=isPrime(i)
    return array

def rotation(num):
    rotation=[]
    digits=list(str(num))
    for x in range(len(digits)):
        rotation.append(int(''.join(digits[x:])+''.join(digits[:x])))
    return rotation

result=4
Max_Value=1000000
primes=Primes(Max_Value)

for x in range(11,Max_Value,2):
    if primes(x):
        rotations=rotation(x)
        for r in rotations:
            if primes(r)==False:
                continue
        result+=1

print result

上面有错误,不知道为什么

>>> >>> ... ... ... ... ... ... ... Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
TypeError: 'list' object is not callable

你可能感兴趣的:(java,python,欧拉工程)