제가 돌릴 땐 예제도 안 나오는데 코드를 다시 확인해보세요.
4948번 - 베르트랑 공준
11번째 줄에서 22번째 줄까지 for 문 내부에서 z와 i의 값은 항상 2보다 크므로 z * i는 항상 합성수 입니다.
따라서 처음에 arr[] 배열을 0이 아닌 값으로 초기화 하고 해당 for 문을 지나면
20번째 줄에 의해서 모든 합성수 (k=z*i)의 배열 값은 0이 됩니다.
반면 소수는 z*i 꼴로 나타낼 수 없으므로 (0이 아닌) 초기값을 유지합니다.
결국 k가 소수이면 arr[k]는 0이 아닌값 (true)을 갖고, k가 합성수면 arr[k]는 0 (false) 값을 갖습니다.
만약 arr[] 배열을 0으로 초기화하면, arr[]의 모든 값은 그대로 0으로 유지되므로 해당 for문은 아무런 의미가 없어집니다.
다만, 해당 코드의 에라토스테네스 체 방법을 사용해서 소수 판별 배열을 구하는 방법은 그다지 효율적이지 않습니다. 이중 for문의 모든 인덱스 조합 (i, z)를 다 거치게 되기 때문입니다.
아래 코드는 에라토스테네스 체를 활용한 조금 더 효율적인 알고리즘 입니다. 아래 코드는 특정 i에 대해서만, 2번째 for문을 실행하므로 더 효율적입니다. 단, 질문자님의 코드와는 다르게 arr[]은 초기에 0으로 초기화 되어 있어야 하며, k가 소수인 경우 arr[k] == 0, k가 합성수 인 경우 arr[k] == 1이 됩니다.
댓글을 작성하려면 로그인해야 합니다.
unsopower 1년 전
시간초과 문제도 아닌거같은데 어디가 틀린지 알 수 있을까요?ㅠㅠ