이경수 선생님의 수학실험실

Problem 37(Truncatable primes) 본문

Project Euler

Problem 37(Truncatable primes)

(이경수) 2019. 6. 6. 17:22

Problem 37(Truncatable primes)

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.

 

In Python:

import math
import time

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

def sieve(n):
    primeList = []
    primeCheck = [1 for i in range(2, n + 1)]
    for i in range(2, n):
        if primeCheck[i - 2] == 1:
            primeList.append(i)
            for j in range(2, int(n // i) + 1):
                primeCheck[i * j - 2] = 0
    return primeList

startTime = time.time()
count = 0
result = 0
primeList = sieve(10 ** 6)

for prime in primeList:
    dig = len(list(str(prime)))
    check = 0
    if dig > 1:
        for i in range(1, dig):
            if isprime(int(str(prime)[i:])) is False:
                check += 1
                break
        if check == 1: continue
        for j in range(1, dig):
            if isprime(int(str(prime)[:-j])) is False:
                check += 1
                break
        if check == 0:
            result += prime
print(result)
print(time.time() - startTime, "seconds")

Run time: 1.2444651126861572 seconds

 

In Java:

package project_euler31_40;

import java.util.ArrayList;

public class Euler37 {
	public static Boolean isprime(int n) {
		if (n == 1) {
			return false;
		}
		for (int i = 2; i < (int)Math.sqrt(n) + 1; i++) {
			if (n % i == 0) {
				return false;
			}
		}
		return true;
	}
	public static void main(String[] args) {
		long startTime = System.currentTimeMillis();
		int n = (int) Math.pow(10, 6);
		String subS = "";
		int subN = 0;
		int dig = 0;
		int check = 0;
		int result = 0;
		ArrayList<Integer> primeList = new ArrayList<Integer>();
		ArrayList<Integer> primeCheck = new ArrayList<Integer>();
		
		for (int i = 2; i < n + 1; i++) {
			primeCheck.add(1);
		}
		for (int i = 2; i < n; i++) {
			if (primeCheck.get(i - 2) == 1) {
				primeList.add(i);
				for (int j = 2; j < Math.floorDiv(n, i) + 1; j++) {
					primeCheck.set(i * j - 2, 0);
				}
			}
		}
		for (int prime : primeList) {
			dig = (int)Math.log10(prime) + 1;
			check = 0;
			if (dig > 1) {
				for (int i = 1; i < dig; i++) {
					subS = Integer.toString(prime).substring(i);
					subN = Integer.parseInt(subS);
					if (isprime(subN) == false) {
						check ++;
						break;
					}
				}
				if (check == 1) {
					continue;
				}
				for (int j = dig; j > 0; j--) {
					subS = Integer.toString(prime).substring(0, j);
					subN = Integer.parseInt(subS);
					if (isprime(subN) == false) {
						check ++;
						break;
					}
				}
				if (check == 0) {
					result += prime;
				}
			}
		}
		System.out.println(result);
		long endTime = System.currentTimeMillis();
		System.out.println((double)(endTime - startTime)/(double)1000 + "seconds");
	}
}

Run time: 0.516seconds

 

Solution: 748317

'Project Euler' 카테고리의 다른 글

Problem 39(Integer right triangles)  (0) 2019.06.16
Problem 38(Pandigital multiples)  (0) 2019.06.15
Problem 36(Double-base palindromes)  (0) 2019.06.06
Problem 35(Circular primes)  (0) 2019.06.04
Problem 34(Digit factorials)  (0) 2019.06.02
Comments