사용자 도구

사이트 도구


jungol:problem_1011

정올 알고리즘 사이트에서 풀었던 문제를 기억하기위해 적어둠

문제 번호: 1011

문제 URL: http://jungol.co.kr/problem.php?ctc=04&id=1011

내가 푼 코드

#include <stdio.h>
 
int is_prime(int param_v);
int compute(int param_n, int param_m, int param_k);
double copied_sqrt(int number);
 
int main(int argc, char* argv[]) {
 
    int N = 0;
    int M = 0;
    int K = 0;
 
    int count = 0;
 
    scanf("%d %d %d", &N, &M, &K);
 
    count = compute(N, M, K);
    printf("%d\n", count);
 
    //printf("argc=%d, argv=%s\n", argc, argv[0]);
    return 0;
}
 
int compute(int param_n, int param_m, int param_k) {
 
    int i = 0;
    int count = 0;
    if (param_n < 2) {
        return -1;
    }
 
    for (i = (param_k + 1); i <= param_m; i = i + param_n) {
        if (is_prime(i) == 1) {
            count = count + 1;
        }
    }
 
    return count;
}
 
int is_prime(int param_v) {
 
    int i = 0;
    int sqrt_value = 0;
    int is_not_prime = 0;
 
    if (param_v == 1) {
        return 1;
    }
 
    sqrt_value = (int)copied_sqrt(param_v);
    for (i = 2; i <= sqrt_value; i++) {
       if (param_v % i == 0) {
           is_not_prime = 1;
           break;
       }
    }
 
    return (is_not_prime == 1) ? 0: 1;
}
 
double copied_sqrt(int number) {
 
    double t;
    double squareRoot = number / 2;
    do {
        t = squareRoot;
        squareRoot = (t + (number / t)) / 2;
    } while ((t - squareRoot) != 0);
 
    return squareRoot;
}

특정한 수가 소수인지 확인 하는 가장 쉬운 방법은 그 수가 가지는 범위의 수들로 하나씩 나눠 보는 것이다.

이 경우, 수의 범위가 큰 경우에는 확인에 필요한 시간이 그만큼 길어진다.

위키 피디아에 정리된 소수 찾기 부분을 참고하면 계산해야 하는 범위를 루트 n(제곱근)까지로 좁힐 수 있기 때문에 필요한 시간을 줄일 수 있다.

알고리즘 통과에 필요한 제한 시간 1초내에 계산이 가능하다.

제곱근 계산에 대한 부분은 Java Calculate Square Root Without Using Library Method 의 소스를 그대로 사용하였다.

문제를 풀고나서 문제 출제 의도를 생각해 보니 출제자는 시험자가 제곱근 계산 코드를 구현할 수 있는지를 테스트 해보려는 의도였던 것 같다.

jungol/problem_1011.txt · 마지막으로 수정됨: 2015/08/26 23:06 저자 lindol