/* 자연수 엠과 엔이 주어질떄 엠이상 엔이하의 자연수 중 소수인 것을 모두 골라 이들 소수의 합과 최소값을 찾는 것 이들 소수의 합은 620이고, 최소값은 61이 됩니다. M 에 지금 3 이라고 가정합니다. 3%2 = 1 이고 3%3 = 0 입니다. */ #include <iostream> #include <vector> using namespace std; int M, N, cnt, sum, minVal; vector<int> prime; void problemIn() { cin >> M >> N; } void solve() { for (int i = M; i <= N; i++) { cnt = 0; for (int j = 2; j <= i; j++) { if (i%j == 0) { cnt++; if (cnt >= 2) break; } } if (cnt == 1) { prime.push_back(i); } } //cout << prime.size() << endl; if (prime.size() == 0) { cout << -1 << endl; } else { for (int i = 0; i < prime.size(); i++) { sum += prime.at(i); } cout << sum << endl; cout << prime.at(0) << endl; } } int main(void) { problemIn(); solve(); return 0; } |
엠엔을 넣고 그 사이에서 소수를 구하는 문제입니다. 여기서 벡터를 이용한 이유는 몇개의 소수가 구해질지 모르겠때문입니다. 딱 정하는 것도 아니고, 찾아서 넣는 것이기 때문에 벡터를 이용하면 굉장히 편리합니다. 그리고 소수를 구하는 과정에서 보면, 자신을 2부터 자신의 숫자까지 자신을 제외한 숫자에서 나눠지면 안됩니다. 그러므로 자기자신은 1이 있다고 보고, 2가 되면 break 가 되도록 합니다. 그리고 이 포문을 모두 돌려본다음에 그 숫자가 나누어지는 숫자를 계산해서 ++ 해두고 나서, 자기 자신 즉 cnt 가 1인 숫자만 저장하도록 합니다. 그것이 소수입니다. 그리고 벡터말고 다른 것으로 구하는게 있는지 살펴보겠습니다. |