| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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
- Geogebra
- 수학탐구
- 오일러
- algeomath
- 제곱근의뜻
- 확률실험
- 파이썬
- 정오각형
- 리만합
- 큰 수의 법칙
- 몬테카를로
- 알지오매스
- counting sunday
- java
- 큰수의법칙
- 작도
- 블록코딩
- 구분구적법
- 상합
- 프랙탈
- 삼각함수의그래프
- 재귀함수
- 지오지브라
- 이항분포
- 프로젝트 오일러
- 하합
- python
- 피타고라스 정리
- 시뮬레이션
- project euler
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