1 분 소요

문제

N이상 M 이하의 수 중에서 소수 구하기

틀림

#include <iostream>
#include <cmath>

int main()
{
    int start;
    int end;
    int num;
    std::cin >> start >> end;

    for (int i = start; i <= end; i++)
    {
        num = sqrt(i);
        // 1이면 소수가 아니고 2, 3은 소수이다.
        if (num == 1 && i != 1)
        {
            std::cout << i << std::endl;
            continue;
        }
        else
        {
            int isPrimeNum = true;
            for (int j = 2; j <= num; j++)
            {
                if (i % j == 0)
                {
                    isPrimeNum = false;
                    break;
                }
            }
            if (isPrimeNum)
            {
                std::cout << i << std::endl;
            }
        }
    }
}

처음에는 입력받은 수까지 반복문을 돌리면서 루트값까지 값을 나누면서 나누어 떨어지는지 아닌지를 확인하면 될 줄 알았다. ….. js 도 그렇게 풀었기 때문ㅇ,,,, 근데 왜 틀림,,?!?!?!?


j == num 이면 소수라는 뜻이므로 코드를 바꾸어 주어야 한다. + std::endl 대신에 \n 을 사용해야된다. 왠지는 정확히 모르겠지만,,여튼 std::endl 로하면 시간 초과가 뜨지만 \n 라면 같은 코드더라도 정답이 된다….

for (int j = 2; j <= num; j++)
    {
        if (i % j == 0)
        {
            break;
        }
        if (j == num)
        {
            std::cout << i << '\n';
        }
    }

else 문을 위와 같이 수정

코드

#include <iostream>
#include <cmath>

int main()
{
    int start;
    int end;
    int num;
    std::cin >> start >> end;

    for (int i = start; i <= end; i++)
    {
        num = sqrt(i);
        // 1이면 소수가 아니고 2, 3은 소수이다.
        if (num == 1 && i != 1)
        {
            std::cout << i << '\n';
            continue;
        }
        else
        {
            for (int j = 2; j <= num; j++)
            {
                if (i % j == 0)
                {
                    break;
                }
                if (j == num)
                {
                    std::cout << i << '\n';
                }
            }
        }
    }
}

풀이

제곱근까지만 소수 인지 아닌지 검사를 해도 그 수가 소수 인지 아닌지를 확인할 수 있다.

댓글남기기