#문제
#작성 코드
#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;
}