# 문제
n이 완전수인지 아닌지 판단해주는 프로그램을 작성하라.
# 풀이
크게 어렵지 않은 문제다. 문제에서 요구하는 대로 차근차근 진행해보자.
바로 정답 소스코드 확인!
#include <iostream>
#include <vector>
using namespace std;
int main(){
ios_base::sync_with_stdio(false); // 두 표준 입출력 동기화 해제
cin.tie(NULL); // 입력과 출력 묶음을 풀기
int n = 0;
while(1){
cin >> n;
if(n == -1) break;
vector<int> factor;
int perfect = 0;
for(int i=1; i<n; i++){
if(n%i == 0){
factor.push_back(i);
perfect += i;
}
}
if(perfect == n){
cout << n << " = ";
for(int i=0; i < factor.size()-1; i++){
cout << factor[i] << " + ";
}
cout << factor[factor.size()-1] << '\n';
} else cout << n << " is NOT perfect." << '\n';
}
return 0;
}
우선 테스트 케이스는 입력으로 -1이 들어올 때까지 끝나지 않으므로 무한루프 while문으로 처리하고 -1이 입력으로 들어올 경우 break를 통해 반복을 중단해주었다.
vector<int> factor;
int perfect = 0;
for(int i=1; i<n; i++){
if(n%i == 0){
factor.push_back(i);
perfect += i;
}
}
지난 번 2501번 풀이 글과 같이 약수의 개수를 모르기 때문에 동적 크기 조정이 가능한 vector로 약수를 담을 공간을 만들어주었다.
그리고 이번엔 완전수인지 아닌지 체크도 해주어야 하기 때문에 n 자신까지는 체크하지 않도록 for문을 처리했고, 약수를 구함과 동시에 perfect 변수에 더해주었다.
if(perfect == n){
cout << n << " = ";
for(int i=0; i < factor.size()-1; i++){
cout << factor[i] << " + ";
}
cout << factor[factor.size()-1] << '\n';
} else cout << n << " is NOT perfect." << '\n';
만약 위에서 구한 perfect가 n과 같으면 해당 수는 완전수이므로 오름차순으로 문제에서 요구하는 방식대로 출력, 완전수가 아니라면 else문으로 완전수가 아님을 출력해주었다. 끝!
728x90
'백준 > C++' 카테고리의 다른 글
[백준] 2581번: 소수 | C++ 풀이 (0) | 2023.06.10 |
---|---|
[백준] 1978번: 소수 찾기 | C++ 풀이 (0) | 2023.06.09 |
[백준] 2501번: 약수 구하기 | C++ 풀이 (0) | 2023.06.07 |
[백준] 5086번: 배수와 약수 | C++ 풀이 (0) | 2023.06.06 |
[백준] 10757번: 큰 수 A+B | C++ 풀이 (0) | 2023.06.05 |