문제 해석
틀린 코드
import java.io.*;
import java.math.BigInteger;
public class Main {
static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
//입력&출력 부분
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
while(N != 0){
countPrime(N); //소수 개수 버퍼에 저장하는 함수 호출
N = Integer.parseInt(br.readLine());
}
br.close();
bw.flush();
bw.close();
}
//소수 개수 세기
static void countPrime(int N) throws IOException {
int count = 0; //소수의 개수를 세는 변수
for(int i = N; i <= 2*N; i++){
BigInteger bigNumber = new BigInteger(String.valueOf(i));
if(bigNumber.isProbablePrime(10)){ //소수이면
count++; //카운트 증가
}
}
bw.write(count +"\n");
}
}
틀린 결과
참고한 사이트
소수 구하는 알고리즘 이 사이트에 설명이 되어있는데, 간단히 요약하면 아래와 같다.
예를 들어 N = 32 라고 하면 아래와 같이 표현할 수 있다.
p x q
1 x 32
2 x 16
4 x 8
8 x 4
16 x 2
32 x 1
p가 증가한다면 q가 감소하고, 반대로 p가 감소한다면 q가 증가하는 것을 볼 수 있다.
코드
import java.io.*;
public class Main {
// N은 1보다 같거나 크고 123,456보다 같거나 작으니까
// 또 N ~ 2N까지니까 최대 배열의 길이는 123,456 x 2 = 246912인데 1부터 시작하므로 246912 + 1 = 246913이다.
static boolean[] primeNumber = new boolean[246913]; //소수 판별 배열
//입력&출력 부분
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
countPrime(); //소수 판별 배열 만들기
while(true){
int N = Integer.parseInt(br.readLine());
if(N == 0){
break;
}
int count = 0; //소수 몇개인지 저장하는 변수
for(int i = N+1; i <= 2*N; i++){ //N보단 커야하므로 +1
//소수이면 배열에서 false인데 그거에 Not연산이니까 소수이면 카운트한다는 뜻
if(!primeNumber[i]) count++;
}
bw.write(count + "\n");
}
br.close();
bw.flush();
bw.close();
}
//소수인지 판별하는 배열 만들기
static void countPrime(){
primeNumber[0] = primeNumber[1] = true; //0과 1은 소수가 아니므로 true
for(int i = 2; i <= Math.sqrt(primeNumber.length); i++){
if(primeNumber[i]) continue; //그냥 i 값 변경하지 않음
for(int j = i * i; j < primeNumber.length; j += i) { //제곱이 걸릴 경우 true로 변경
primeNumber[j] = true; //제곱근 x 제곱근 한 것은 제곱근으로 나눌 수 있으므로 true
}
}
}
}
결과
느낀 점