반응형
1억보다 작은, 소수 둘만의 곱인 합성수의 갯수를 구하라. 4나 9도 포함된다. 에라스토테네스의 체 방법으로 소수를 우선 싹 구하고 한다. 내가 가장 효율적이라고 생각했던 소수 구하는 방법은 전혀 효율적이지 않았다.
#!/usr/bin/env python
# http://projecteuler.net/index.php?section=problems&id=187
MAX=50000000
flags = [ 1 ] * MAX
flags[0] = 0
flags[1] = 0
for n in range(2, MAX):
if flags[n] == 1:
m = 2*n
while m < MAX:
flags[m] = 0
m+=n
n+=1
primes = [ ]
for i in range(0, MAX):
if flags[i] == 1:
primes.append(i)
count = 0
count += len(primes)
i = 1
while primes[i]*primes[i] < 2*MAX:
cnt = 0
max = (2*MAX)//primes[i]
j = i
while 1:
if primes[j] > max:
break
j+=1
cnt+=1
count+=cnt
i+=1
print(count)
728x90
'프로그래밍 > 알고리즘' 카테고리의 다른 글
[Euler Project 101] 수열 다항식으로 근사하기 (0) | 2009.07.26 |
---|---|
[Euler Project 188] 1777의 1885 거듭거듭제곱의 마지막 8자리 구하기 (0) | 2009.07.26 |
[Euler Project 091] 직각삼각형 갯수 구하기 (0) | 2009.07.26 |
[수학] 페르마 소정리 이해를 위한 장난 (0) | 2009.07.07 |
[Project Euler 213] 30x30 격자 벼룩 (0) | 2009.02.18 |