#문제

#작성 코드

#include <iostream>
#include <stdio.h>
 
bool primeArr[123456*2+1];
int main()
{
	int n;
	while(1){
		scanf("%d", &n);
		if( n==0 ) break;
		// n보다 크고 2n보다 작거나 같은 소수의 개수를 구하자.
		std::fill_n(primeArr, 123456*2+1, true);	// 생성한 배열 true로 초기화 
		primeArr[0]=false;
		primeArr[1]=false;
		for(int i=2; i*i<=2*n; i++){
			// i가 소수가 아니면 pass! 
			if( primeArr[i] == false ){
				continue;
			}
			// i는 소수이므로 건너뛰고 i의 배수들이 소수가 아님을 표시 
			for(int j=i+i; j<=2*n; j+=i){
				primeArr[j] = false;
			}
		}
		
		// n보다 크고, 2n보다 작거나 같은 소수의 개수 출력 
		int cnt=0;
		for(int k=n+1; k<=2*n; k++){
			if(primeArr[k]==true){
				cnt++;
			}
		}
		printf("%d\n", cnt);
	}
	// n에 0이 입력될 때까지 계속 테스트케이스를 입력받는다. 
	return 0;
} 

##

처음에는 매 테스트케이스에서 n을 입력받을 때마다 bool primeArr배열을 동적으로 할당받는 식의 코드를 작성했었는데 dev c++에서는 제대로 동작했지만 boj에서는 틀렸습니다 판정을 받았다. 왜 그런거지?

결국 최대 n값인 123456까지를 저장할 수 있도록 전역변수로 bool primeArr[123456*2+1]을 선언해서 맞았습니다 판정을 받았다.

아래는 틀렸다고 판정받은 코드. primeArr배열의 선언 이외에는 모두 동일하다.

더보기
#include <iostream>
#include <stdio.h>

int main()
{
	int n;
	while(1){
		scanf("%d", &n);
		if( n==0 ) break;
		// n보다 크고 2n보다 작거나 같은 소수의 개수를 구하자.
		bool *primeArr = new bool[2*n+1];
		std::fill_n(primeArr, 123456*2+1, true);	// 생성한 배열 true로 초기화 
		primeArr[0]=false;
		primeArr[1]=false;
		for(int i=2; i*i<=2*n; i++){
			// i가 소수가 아니면 pass! 
			if( primeArr[i] == false ){
				continue;
			}
			// i는 소수이므로 건너뛰고 i의 배수들이 소수가 아님을 표시 
			for(int j=i+i; j<=2*n; j+=i){
				primeArr[j] = false;
			}
		}
		
		// n보다 크고, 2n보다 작거나 같은 소수의 개수 출력 
		int cnt=0;
		for(int k=n+1; k<=2*n; k++){
			if(primeArr[k]==true){
				cnt++;
			}
		}
		delete[] primeArr;
		printf("%d\n", cnt);
	}
	// n에 0이 입력될 때까지 계속 테스트케이스를 입력받는다. 
	return 0;
} 

 

'BOJ' 카테고리의 다른 글

BOJ 1085번 :: 직사각형에서 탈출  (0) 2019.11.19
BOJ 9020번 :: 골드바흐의 추측  (0) 2019.11.19
BOJ 1929번 :: 소수 구하기  (0) 2019.11.18
BOJ 2581번 :: 소수  (0) 2019.11.18
BOJ 1978번 :: 소수 찾기  (0) 2019.11.17

+ Recent posts