[백준] 9506번 - 약수들의 합 C++

문제
어떤 숫자 n이 자신을 제외한 모든 약수들의 합과 같으면, 그 수를 완전수라고 한다.
예를 들어 6은 6 = 1 + 2 + 3 으로 완전수이다.
n이 완전수인지 아닌지 판단해주는 프로그램을 작성하라.
입력
입력은 테스트 케이스마다 한 줄 간격으로 n이 주어진다. (2 < n < 100,000)
입력의 마지막엔 -1이 주어진다.
출력
테스트케이스 마다 한줄에 하나씩 출력해야 한다.
n이 완전수라면, n을 n이 아닌 약수들의 합으로 나타내어 출력한다(예제 출력 참고).
이때, 약수들은 오름차순으로 나열해야 한다.
n이 완전수가 아니라면 n is NOT perfect. 를 출력한다.

풀기전 로직 생각한 것
  1. 무한 루프를 통해 N을 입력받는다. -1이면 종료하도록.
  2. 다시 반복문으로 per값 1로하여 N-1까지 1씩 증가 시키며 N을 나눴을때 나머지가 1이면 약수이다.
  3. 이 약수값을 따로 isPerfect라는 변수에 저장한다. (isPerfect를 1로 초기화 하여 per을 2부터 시작시키면 연산이 줄어듦)
  4. isPerfect가 N과 같으면 완전수이므로 다시 2번과 같은 방법으로 약수를 출력시키게한다. 반복문이 끝나면 들여쓰기
  5. 같지 않으면 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;
}

 

결과