| 문제
자연수 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을 출력한다.
| 예제 입력 1
60
100
| 예제 출력 1
620
61
| 예제 입력 2
64
65
| 예제 출력 2
-1
| 문제의 키 포인트
1. 첫째 줄에 M부터 N까지라는 범위값이 주어진다.
2. 출력에는 해당 범위의 속하는 소수들의 합과 최소값을 출력한다.
| 해결방안(Solution)
1. 소수란? 1 또는 자기 자신 이외에는 나누어지지 않는 수라는 점을 조건으로 사용
2. M부터 N까지라는 범위
> for 반복문을 통해 해당 범위에서 조건 반복 실행
3. 소수인 경우, 아래의 두 식을 실행한다.
(1) 소수값 더하기
(2) 최소 소수인지 판별하기
4. M과 N이 10,000이하의 자연수이며 소수가 없을 경우 "-1"을 출력하도록 한다.
> 최소값을 10,001로 지정해두고 이후 조건에서 최소값이 없는 경우 10,001이므로 "-1"을 출력하도록 한다.
> 이는 두 가지 경우를 간단히 표현한 것인데 두 가지는 경우는 아래와 같다.
(1) M과 N이 10,000을 넘어갈 경우
(2) 최소값이 없는 경우
| 소스코드(SourceCode)
// BOJ_2581_decimal, 소수
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int M, N, i, j;
int cnt = 0, result = 0, min = 10001;
scanf("%d\n%d", &M, &N);
for (i = M; i <= N; i++)
{
for (j = 2; j < i; j++)
{
if (i % j == 0) // 두 수가 서로 나누어지면 소수 X
{
cnt++;
}
}
if (cnt == 0 && i != 1)
{
result += i; // 소수들의 합 계산
if (min > i) // 최소값 소수 판별
{
min = i;
}
}
cnt = 0;
}
if (min == 10001) // 수가 10000을 초과하는 경우
{
printf("-1\n");
}
else // 수가 10000을 초과하지 않는 경우
{
printf("%d\n%d\n", result, min);
}
return 0;
}
| 문제출처
https://www.acmicpc.net/problem/2581
'코딩 | 알고리즘 & 문제풀이 > 백준_Backjoon' 카테고리의 다른 글
[C언어] Backjoon_Code 1929, 소수 구하기 (0) | 2021.07.26 |
---|---|
[C언어] Backjoon_Code 11653, 소인수분해 (0) | 2021.07.25 |
[C언어] Backjoon_Code 1978, 소수찾기 (0) | 2021.07.23 |
[C언어] Backjoon_Code 1011, Fly me to the Alpha Centauri (0) | 2021.07.22 |
[C언어] Backjoon_Code 2869, 달팽이는 올라가고 싶다 (0) | 2021.07.17 |