4134번: 다음 소수
첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다.
www.acmicpc.net
자연수 n 이하의 소수의 개수를 찾는 문제를 에라토스테네스의 체를 이용하여 푼 적이 있다.
[Programmers][Python] 소수 찾기
1. 시간 초과 n 이하의 소수 개수를 찾는 문제이다. n이 1000000 이하의 자연수라 처음 한 방법은 시간초과가 났다. list를 계속 만들어서 그런가? def solution(n): prime = list(range(2, n + 1)) for i in range(2, n +
hiparsley.tistory.com
이번 문제는 주어진 수 n보다 크거나 같은 수 중 가장 작은 소수를 찾는 문제이다.
n은 4*10^9보다 작거나 같은 자연수이다.
때문에 그의 제곱근인 63246보다 작은 수들에 대해 각 수가 소수인지 판단하는 bool array를 만들었다.
다시 생각해보니 63247보다 큰 수까지도 array에 넣었어야 할 것 같다.
그 다음 수 n을 받아서 n을 63246보다 작은 소수로 나누었을 때 나머지가 0이면 n++을 하고 다시 수행,
63246보다 작은 모든 소수에 대하여 나머지가 0인 경우가 없었다면 n을 소수로 판별했다.
package orgs.BOJ;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
/*
System.out.print(Math.sqrt(4 * Math.pow(10, 9)));
63245.553203367585
*/
boolean [] isNotPrime = new boolean[63247];
isNotPrime[0] = isNotPrime[1] = true;
for (int i = 2; i < 63247; i++) {
if (!isNotPrime[i]) {
int j = i;
while (j <= 63247 - i) {
j += i;
isNotPrime[j] = true;
}
}
}
for (int i = 0; i < n; i++) {
long a = sc.nextLong();
if (a <= 63246) {
while (true) {
if (!isNotPrime[(int) a]) {
System.out.println(a);
break;
}
a++;
}
} else {
while (true) {
for (int k = 2; k <= Math.sqrt(a);) {
if (!isNotPrime[k]) {
if (a % k == 0) {
a++;
k = 2;
continue;
}
}
k++;
}
System.out.println(a);
break;
}
}
}
sc.close();
}
}
'BOJ' 카테고리의 다른 글
[BOJ] [JAVA] 20920번 영단어 암기는 괴로워 (0) | 2024.01.14 |
---|---|
[BOJ] [JAVA] 1016번 제곱 ㄴㄴ 수 (2) | 2024.01.11 |
[BOJ] [JAVA] 11866번 요세푸스 문제0 (0) | 2024.01.10 |
[BOJ] [JAVA] 9012번 괄호 (1) | 2024.01.07 |
[BOJ] [JAVA] 13241번 최소공배수 (0) | 2024.01.06 |
[BOJ] [JAVA] 10816번 숫자 카드 2 (0) | 2024.01.06 |
[BOJ] [JAVA] 7785번 회사에 있는 사람 (0) | 2024.01.06 |
[BOJ] [JAVA] 18870번 좌표 압축 (2) | 2024.01.06 |