출처 | https://www.acmicpc.net/problem/2581
자연수 M과 N이 주어질 때 M이상 N이하의 자연수 중 소수인 것을 모두 골라 이들 소수의 합과 최솟값을 찾는 프로그램을 작성하시오.
예를 들어 M=60, N=100인 경우 60이상 100이하의 자연수 중 소수는 61, 67, 71, 73, 79, 83, 89, 97 총 8개가 있으므로, 이들 소수의 합은 620이고, 최솟값은 61이 된다
입력의 첫째 줄에 M이, 둘째 줄에 N이 주어진다.
M과 N은 10,000이하의 자연수이며, M은 N보다 작거나 같다.
M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다.
단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.
#include <stdio.h>
int main()
{
//1.소수를 입력받을 때 범위가 주어진다. [사용자로부터 값을 입력받는다.]
//2.값을 입력받는 것을 시점으로 총 2가지의 for문 하나는 전체적인 틀을 구성하는 for문[범위] -> 다른 하나는 안에 탐색하는 for문으로 구성
//3.우리가 처음에 소수를 발견했을 때, -> 이것이 최솟값이 된다. [key 1]
//4.j가 아닌 i가 == 2 일경우도 고려해야 된다. i == 2일 경우 밖 for문만 돌아간다.
//5. i == 2일때 최솟값, 최댓값 예외처리
int m, n, key, i, j;
int sum = 0;
int min = 0;
scanf_s("%d %d", &m, &n);
for (i = m; i < n; i++) //전체 범위
{
for (j = 2; j < i; j++) //탐색하는 idea
{
if (i % j == 0) break;
if (j == i - 1)
{
sum += i;
if (min == 0) // 최솟값을 찾는 조건
min = i;
}
}
if (i == 2) //i가 2일때 소수일 조건을 만족하는 경우를 나눠서 예외처리.
{
sum += i;
min = i; //이렇게 되면 최솟값 => 정의
}
}
if (min != 0)
{
printf("%d\n%d", sum, min);
}
else
{
printf("-1");
}
}