問題描述:
The number 3797 has an interesting property. Being prime itself, it is possible to continuously remove digits from left to right, and remain prime at each stage: 3797, 797, 97, and 7. Similarly we can work from right to left: 3797, 379, 37, and 3.
Find the sum of the only eleven primes that are both truncatable from left to right and right to left.
NOTE: 2, 3, 5, and 7 are not considered to be truncatable primes.
解決問題:
package projecteuler;
import java.util.Arrays;
public class Problem37 {
public static boolean prime[] ;
public static int UP = 11;
public static boolean IsPrime(int number) {
boolean result = true;
if(number==1||number==2){
return true;
} else if (number % 2 == 0) {
return true;
} else {
int middle = (int) Math.sqrt(number);
for (int i = 3; i <= middle; i += 2) {
if (number % i == 0) {
return false;
}
}
}
return true;
}
public static boolean IsNumber(int number){
int tmp = number;
int max = 10;
int n;
do{
n = tmp%max;
// System.out.println("1:"+tmp%max);
if(!prime[n]){
return false;
}
max = max*10;
}while(n!=number);
max = max/100;
// System.out.println("Max:"+max);
do{
n = tmp/max;
// System.out.println("2:"+tmp/max);
if(!prime[n]){
return false;
}
max = max/10;;
}while(n!=number);
return true;
}
public static void main(String[] args){
long t1 = System.currentTimeMillis();
prime = new boolean[3000000];
Arrays.fill(prime, false);
for (int i = 3; i < 3000000; i=i+2) {
if(IsPrime(i))
prime[i] = true;
}
prime[2] = true;
int n = 11;
int count = 0;
int sum = 0;
do{
if(IsNumber(n)){
sum +=n;
count++;
System.out.println(n);
}
n = n+2;
}while(count<UP);
long t2 = System.currentTimeMillis();
System.out.println("Sum:"+sum);
System.out.println(t2-t1);
}
}