[C언어] 백준 2581 : 소수
생각의 흐름
소수를 찾는건 이전 문제에서 했으니 걱정이 안됐고, 여기에선 sum과 min을 고려해야 한다.
이전 문제에서는 배열로 다 저장한다음에 진행을 했었는데, 피드백으로 즉각즉각 처리해주는 방법을 배웠다. 이번엔 그렇게 할 생각이다.
-
60~100반복문을 돌린다. 소수를 찾는다. 61이 걸리는데, 바로 sum = sum + a(61)로 합을 계산해준다.
-
그렇게 계속 소수일경우 더해서 첫번째줄은 해결했다.
-
이제 min을 구해야 하는데, a값으로 초기화해놓고 if min반복문돌려서 하려고 했으나 그러면 항상 60이 출력되기에 고민을 더 했다.
-
min을 미뤄놓고 범위 중 소수가 없는 경우를 먼저 처리해주기로 했다. 그러기 위해서 flag를 세워놓고 0으로 초기화, 소수를 발견하면 flag값을 변경해주면 flag == 0일때는 소수가 없다는 뜻이 된다. 그럴 때 출력해서 이 조건도 끝났다.
-
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;
}
같은 논리를 사용하였다.
Author And Source
이 문제에 관하여([C언어] 백준 2581 : 소수), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kimmainsain/C언어-백준-2581-소수저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)