题目链接: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 7boolean[] 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 Falsereturn Truedef Primes(n):array=[True]*nfor i in range(3,n):array[i]=isPrime(i)return arraydef rotation(num):rotation=[]digits=list(str(num))for x in range(len(digits)):rotation.append(int(''.join(digits[x:])+''.join(digits[:x])))return rotationresult=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:continueresult+=1print result
上面有错误,不知道为什么
>>> >>> ... ... ... ... ... ... ... Traceback (most recent call last):File "<stdin>", line 2, in <module>
TypeError: 'list' object is not callable