일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 프랙탈
- java
- 큰 수의 법칙
- 제곱근의뜻
- 리만합
- 작도
- 파이썬
- project euler
- 정오각형
- 피타고라스 정리
- python
- 몬테카를로
- 프로젝트 오일러
- 상합
- 구분구적법
- Geogebra
- 블록코딩
- 큰수의법칙
- algeomath
- 수학탐구
- 재귀함수
- 삼각함수의그래프
- 알지오매스
- 지오지브라
- counting sunday
- 하합
- 시뮬레이션
- 이항분포
- 오일러
- 확률실험
Archives
- Today
- Total
이경수 선생님의 수학실험실
Problem 37(Truncatable primes) 본문
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