문제
어떤 숫자 n이 자신을 제외한 모든 약수들의 합과 같으면, 그 수를 완전수라고 한다.
예를 들어 6은 6 = 1 + 2 + 3 으로 완전수이다.
n이 완전수인지 아닌지 판단해주는 프로그램을 작성하라.
입력
입력은 테스트 케이스마다 한 줄 간격으로 n이 주어진다. (2 < n < 100,000)
입력의 마지막엔 -1이 주어진다.
출력
테스트케이스 마다 한줄에 하나씩 출력해야 한다.
n이 완전수라면, n을 n이 아닌 약수들의 합으로 나타내어 출력한다(예제 출력 참고).
이때, 약수들은 오름차순으로 나열해야 한다.
n이 완전수가 아니라면 n is NOT perfect. 를 출력한다.
풀기전 로직 생각한 것
- 무한 루프를 통해 N을 입력받는다. -1이면 종료하도록.
- 다시 반복문으로 per값 1로하여 N-1까지 1씩 증가 시키며 N을 나눴을때 나머지가 1이면 약수이다.
- 이 약수값을 따로 isPerfect라는 변수에 저장한다. (isPerfect를 1로 초기화 하여 per을 2부터 시작시키면 연산이 줄어듦)
- isPerfect가 N과 같으면 완전수이므로 다시 2번과 같은 방법으로 약수를 출력시키게한다. 반복문이 끝나면 들여쓰기
- 같지 않으면 is Not perfect를 출력
코드
#include <iostream>
using namespace std;
int main() {
int N; //어떤 숫자
while (true) {
int isPerfect = 0;
cin >> N;
if (N == -1)
break;
//약수 구하는 문제
for (int per = 1; per < N; per++) {
if (N % per == 0) {
isPerfect += per; //약수의 총합
}
}
if (isPerfect == N) { // 완전수인지 판단
cout << N << " = 1"; // 모든 숫자는 1을 반드시 약수로 가진다.
for (int per = 2; per < N; per++) { // 2부터 약수인지 판단하여 출력
if (N % per == 0) {
cout << " + " << per;
}
}
cout << endl; // 완전수 출력 후 줄바꿈
}
else { // 완전수가 아닐 경우
cout << N << " is NOT perfect."<<endl; // 완전수가 아님을 출력하고 줄바꿈
}
}
return 0;
}
결과
'백준' 카테고리의 다른 글
[백준] 2231번 - 분해합 C++ (0) | 2024.06.22 |
---|---|
[백준] 1978번 - 소수 찾기 C++ (0) | 2024.05.20 |
[백준] 2501번 - 약수 구하기 C++ (0) | 2024.05.18 |
[백준] 5086번 - 배수와 약수 C++ (0) | 2024.05.18 |
[백준] 2869번 - 달팽이는 올라가고 싶다 C++ (0) | 2024.05.17 |