에라토스테네스의 체는 합성수를 지우는 방식으로 소수를 찾는 방법이다.
소수(Prime Number)
소수는 자신보다 작은 두 개의 자연수를 곱하여 만들 수 없는 1보다 큰 자연수이다. 약수로 1과 자기 자신만을 가지는 정수라고 할 수 있다.
합성수
1과 자기 자신 이외의 약수를 가진 정수로 두개 이상의 소수의 곱이다.(비소수)
동작 과정
- 1은 제거
- 지워지지 않은 수 중 제일 작은 2를 소수로 채택하고 2의 배수를 모두 지운다.
- 지워지지 않은 수 중 제일 작은 3을 소수로 채택하고 나머지 3의 배수를 모두 지운다.
- 지워지지 않은 수 중 제일 작은 수 중 제일 작은 5를 소수로 채택하고 나머지 5의 배수를 모두 지운다.
- 이러한 과정을 반복한다.
n = int(input())
a = [False, False] + [True]*(n-1)
primes =[]
for i in range(2, n+1):
if a[i]:
primes.append(i)
for j in range(2*i, n+1, i):
a[j] = False
print(primes)
- 입력한 n 값 까지의 모든 소수를 구하는 코드이다.
- [False, False]를 해주는 이유는 인덱스의 시작은 0이기 때문에 0과 소수가 아닌 1을 False로 해준다.
- for j in range(2*i, n+1, i)는 동작과정 2 ~ 5 과정을 해주는 것이다.
코드(Java)
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 29 30 31 32 33 34 35 | import java.util.ArrayList; import java.util.Scanner; public class Eratostenes { public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc = new Scanner(System.in); int n = sc.nextInt(); boolean[] primeList = new boolean[n+1]; ArrayList<Integer> prime = new ArrayList<Integer>(); primeList[0] = false; primeList[1] = false; for(int i =2; i<=n; i++) { primeList[i] = true; } for(int i=2; i<n+1; i++) { if(primeList[i]) { prime.add(i); for(int j=2*i; j<=n; j+=i) { primeList[j] = false; } } } System.out.println(prime); } } | cs |
'프로그래밍 > Algorithm' 카테고리의 다른 글
너비 우선 탐색(BFS: Breadth First Search) (0) | 2023.03.24 |
---|---|
조합과 순열 (0) | 2019.08.27 |