[C언어] 백준 2581 : 소수

10571 단어 C백준C

생각의 흐름

소수를 찾는건 이전 문제에서 했으니 걱정이 안됐고, 여기에선 sum과 min을 고려해야 한다.
이전 문제에서는 배열로 다 저장한다음에 진행을 했었는데, 피드백으로 즉각즉각 처리해주는 방법을 배웠다. 이번엔 그렇게 할 생각이다.

  1. 60~100반복문을 돌린다. 소수를 찾는다. 61이 걸리는데, 바로 sum = sum + a(61)로 합을 계산해준다.

  2. 그렇게 계속 소수일경우 더해서 첫번째줄은 해결했다.

  3. 이제 min을 구해야 하는데, a값으로 초기화해놓고 if min반복문돌려서 하려고 했으나 그러면 항상 60이 출력되기에 고민을 더 했다.

  4. min을 미뤄놓고 범위 중 소수가 없는 경우를 먼저 처리해주기로 했다. 그러기 위해서 flag를 세워놓고 0으로 초기화, 소수를 발견하면 flag값을 변경해주면 flag == 0일때는 소수가 없다는 뜻이 된다. 그럴 때 출력해서 이 조건도 끝났다.

  5. flag를 사용하다보니, 아이디어가 떠올랐는데 결국 min은 맨 처음 발견한 소수를 지정한다. 그러기에 flag == 1일경우 min을 지정해주고, 그 뒤는 신경안써도 된다.

내가 푼 코드

#include <stdio.h>

int main()
{
    int a, b, i, sum, min, flag;
    scanf("%d %d", &a, &b);
    sum = 0;
    min = a;
    flag = 0;
    while (a <= b)
    {
        if (a >= 2)
        {
            int i = 2;
            while (i <= a)
            {
                if (i == a)
                {
                    sum = sum + a;
                    flag++;
                    if (flag == 1)
                        min = a;
                }
                if (a % i == 0)
                    break;
                i++;
            }
        }
        a++;
    }
    if (flag == 0)
    {
        printf("-1");
        return 0;
    }
    printf("%d\n%d", sum, min);
}

다른 사람 코드

#include <stdio.h>

int main()
{

    int m, n;
    int sum = 0;
    int min = 10001;
    scanf("%d %d", &m, &n);
    if (m == 1)
        m++;
    for (; m <= n; m++)
    {
        int check = 1;
        for (int j = 2; j <= m / 2; j++)
        {
            if (m % j == 0)
            {
                check = 0;
                break;
            }
        }
        if (check == 1)
        {
            if (min > m)
                min = m;
            sum += m;
        }
    }
    if (sum == 0)
        printf("-1\n");
    else
    {
        printf("%d\n%d\n", sum, min);
    }
    return 0;
}

같은 논리를 사용하였다.

좋은 웹페이지 즐겨찾기