글 작성자: 취업중인 피터팬
728x90

https://www.acmicpc.net/problem/9506

 

9506번: 약수들의 합

어떤 숫자 n이 자신을 제외한 모든 약수들의 합과 같으면, 그 수를 완전수라고 한다. 예를 들어 6은 6 = 1 + 2 + 3 으로 완전수이다. n이 완전수인지 아닌지 판단해주는 프로그램을 작성하라.

www.acmicpc.net

 

문제 설명

 

약수를 모두 찾고 그 수의 합과 수를 비교하는 문제입니다.

 

문제 풀이

 

약수는 반복문으로 모두 나눠서 확인하고 해당 수와 비교하면 쉽게 풀 수 있는 문제입니다.

풀다 보면 자연스럽게 정답으로 갈 수 있으실 겁니다.

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);


        while(true) {
            StringBuilder stb = new StringBuilder();//문자열을 만들어 출력할 변수
            int num = sc.nextInt();//입력한 숫자
            //입력한 숫자가 -1일 경우 반복 종료
            if(num == -1){
                break;
            }
            //-1로 배열을 만들 수 없음으로 break 문 뒤에 만듬
            int[] aliquot = new int[num];//약수 확인에 필요한 배열
            int add = 0;//약수를 더한 값
            boolean flag = false;//첫 약수는 +을 넣지 않음

            //1~수까지 모두 나눠서 약수 찾기
            for (int i = 1; i < num; i++) {
                if (num % i == 0) {
                    add += i;//약수 더함
                    aliquot[i] = 1;//약수 INDEX 1로 변경
                }
            }

            //약수의 총합과 수가 같을 때
            if (num == add) {
                stb.append(num + " = ");//해당수 =
                //배열을 돌려가면서 문자열을 입력함
                for (int i = 0; i < aliquot.length; i++) {
                    if (aliquot[i] == 1 && flag == false) { //첫 약수일 때
                        flag = true;
                        stb.append(i);// 해당수 = 약수
                    } else if (aliquot[i] == 1 && flag == true) { // 두 번째 약수 일 때
                        stb.append(" + " + i);// 해당수 = 약수 + 약수 ..
                    }
                }
            } else { // 약수의 총합과 수가 다를 때
                stb.append(num + " is NOT perfect.");
            }

            //출력
            System.out.println(stb);
        }
    }
}