소수 판별하고 최솟값, 합 출력하기
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이 된다.
코드
#include <iostream>
#include <math.h>
using namespace std;
bool isPrime(int n) {
if(n<=1) {
return false;
}
for(int i=2; i<=sqrt(n); i++) {
if((n%i)==0) {
return false;
}
}
return true;
}
int main() {
int M, N;
cin >> M >> N;
int min = M;
int sum = 0;
while (M <= N) {
if(isPrime(M)) {
min=M;
break;
}
M++;
}
while (M <= N) {
if(isPrime(M)) {
sum+=M;
}
M++;
}
if(sum!=0) {
cout<<sum<<"\n"<<min;
} else {
cout<<-1;
}
return 0;
}
소수를 판별할 때 해당 수의 제곱근까지만 검사해도 소수 여부를 판별할 수 있다.
n이 1보다 같거나 작으면 소수가 아니므로 return false
n의 제곱근보다 작고 2보다 크거나 같은 수 i로 n%i를 조사해서 하나라도 0이 나온다는 것은
n이 i의 배수라는 뜻이므로 return false
결국 저 함수들이 멈추지 않고 다 돌 때만 true를 리턴하는 게 isPrime 함수다.
맨 처음에 최솟값을 찾는데 최댓값과 다르게 최솟값은 계속 갱신해 줄 필요가 없다.
따라서 찾는 즉시 break
그 다음 while문에서는 합을 출력하는 건데 isPrime이 true 일 때만 더하므로 sum은 소수들의 합이 된다.
그리고 나서 출력해주면 되는데 백준 문제 풀 때 C++에서는 endl보다 "\n"이 효율적이다.
'PS' 카테고리의 다른 글
백준 1157번 C++ 단어 공부 (2) | 2019.05.13 |
---|---|
백준 1181번 C++ 단어 정렬하기 (0) | 2019.04.11 |
백준 1026번 C++ 보물 (0) | 2019.02.14 |
백준 10866번 C++ 덱 구현 (0) | 2019.02.12 |
C++ Queue(큐) 배열, 연결 리스트로 구현 (0) | 2019.02.12 |
댓글