M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.
그냥 전 문제와 똑같이 풀었다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
그랬더니 시간 초과가 떴다. 따라서 다른 방법으로 풀어야 한다. 1
크게 어려운 방법은 아니니 그냥 그대로 짜면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include<stdio.h> #include<malloc.h> #define MAX 1000001 int main() { int *num = calloc(MAX, sizeof(int)); int M, N; scanf("%d %d", &M, &N); num[1] = -1; for (int i = 2;(i*i) <= N;i++) { for (int j = 2;j <= (N / i);j++) { num[i*j] = -1; } } for (int i = M;i <= N;i++) { if (num[i] == 0) printf("%d\n", i); } free(num); return 0; } |
int로 배열을 선언 했더니 오버플로우가 떠서 동적할당해버렸다.
어차피 0으로 초기화해서 사용할 거니깐 그냥 calloc으로 동적할당 시켰다.
i는 23456식으로 증가하는 변수이고 j는 i의 배수들을 뜻한다.
처음부터 끝까지 다 돌 필요 없이 적당히 돌려주면 된다.
어떤 수의 배수들은 배열에서 -1로 설정하고 반복문이 끝난 이후 0인 숫자들만 출력하면 된다. 2
글 작성하면서 든 생각인데 num[i]가 이미 -1인 경우에는 굳이 더 볼 필요 없어보인다.
'알고리즘' 카테고리의 다른 글
BOJ 9020 골드바흐의 추측 (0) | 2018.09.01 |
---|---|
BOJ 4948 베르트랑 공준 (0) | 2018.09.01 |
BOJ 2581 소수 (0) | 2018.08.17 |
BOJ 1978 소수 찾기 (0) | 2018.08.17 |
BOJ 6064 카잉 달력 (0) | 2018.08.17 |