완전수 구하기

자기 자신을 제외한 모든 양의 약수들의 합이 자기 자신이 되는 자연수를 완전수라고 한다. 예를 들면, 6과 28은 완전수이다. 6=1+2+3 // 1,2,3은 각각 6의 약수 28=1+2+4+7+14 // 1,2,4,7,14는 각각 28의 약수

입력으로 자연수 N을 받고, 출력으로 N 이하의 모든 완전수를 출력하는 코드를 작성하라.

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

4개의 풀이가 있습니다.

//자연수 받아서 그이하의 완전수 출력
public class NaturalNumber {

    static ArrayList<Integer> pNo = new ArrayList<Integer>();
    public static void main(String[] args) {
        Scanner sc= new Scanner(System.in);
        System.out.println("숫자를 입력하세요");
        int mynumber = sc.nextInt();

        //1000 이하의 자연수 입력
        for(int naturalNumber=1;naturalNumber<mynumber;naturalNumber++)
        cc(naturalNumber);

        //완전수 출력
        System.out.print("완전수: ");
        for (int s = 0; s < pNo.size(); s++) {
            System.out.print(pNo.get(s) + " ");
        }
    }
    // 약수 구하기
    public static void cc(int naturalNumber) {
        ArrayList<Integer> cc = new ArrayList<Integer>();
        int i = 0;
        while (naturalNumber != i) {
            i++;
            if (naturalNumber % i == 0) {
                cc.add(i);
            }
        }
        check(naturalNumber, cc);
    }
    // 완전수 확인
    public static void check(int naturalNumber, ArrayList<Integer> cc) {
        int sum = 0;
        for (int i = 0; i < cc.size(); i++) {
            sum += cc.get(i);
        }
        if ((sum - naturalNumber) == naturalNumber) {
            pNo.add((sum - naturalNumber));
        }
    }
}

자바 배운지 얼마 안되서 이걸로 해봤는데 5번째 완전수 부턴 이방식으로는 콘솔에선 안나오더라구요!

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
public class Lv1_01 {
    public static void main(String[] args) {
        PerfectNumber p = new PerfectNumber(500000);
        p.result();
    }

}

class PerfectNumber {
    private int n;

     public PerfectNumber(int n){
         this.n = n;
     }

    void play(int num) {
        int result = num;       // 비교를 위해 원본을 저장
        ArrayList<Integer> arr = new ArrayList<Integer>();  // 배열을 생성 
        int sum = 1;    // 약수의 합을 구할 변수  1은 모든 수의 공통약수이기 때문에 디폴트로 지정
        int end = num;  // for문의 중복을 막기위해 종료 위치를 변경해주는 변수
        for (int i = 2; i < end; i++) {
            // num을 2부터 나눠보는데 나머지가 0이면 나누어 떨어지기 때문에 약수가 된다  
            if (num%i==0) {
                arr.add(i);
                arr.add(num/i);
                end = num/i;
            }

        }
        //배열의 합
        for (int i = 0; i < arr.size(); i++) {
            sum+=arr.get(i);
        }

        //배열의 합이 처음 입력받은 수와 같은지 비교
        if (sum==result) {
            System.out.println(sum);
        }

    }

    void result() {
        //입력받은 수부터 2까지 계속 돌려본다
        for (int i = n; i >= 2; i--) {
            play(i);
        }

    }
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
import java.util.Scanner;

public class test05 {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        System.out.print("자연수를 입력하세요 : ");

        int num = sc.nextInt();

        for(int i=1; i<=num; i++){
            if(isPerfectNum(i)){
                System.out.println(i);
            }
        }
    }



    //완전수인지 확인하기 위한 함수
    public static boolean isPerfectNum(int su){
        int sum=0;
        for(int i=1; i<=su; i++){
            if(su%i == 0 && su!=i){
                sum += i;
            }
        }
        if(sum == su){
            return true;
        }else{
            return false;
        }
    }
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
import javax.swing.JOptionPane;

public class lv1_2 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int userinputnumber = Integer.parseInt(JOptionPane.showInputDialog("자연수를 입력하시오."));


        for(int userinputnumberdown = 1; userinputnumberdown <= userinputnumber ; userinputnumberdown++){
            int sum = 0;
            for(int i=1; i<userinputnumberdown; i++){
                if(userinputnumberdown%i == 0){
                    sum += i;
                }
            }
            if(sum == userinputnumberdown){
                System.out.println(sum);
            }
        }
    }

}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

풀이 작성

※ 풀이작성 안내
  • 본문에 코드를 삽입할 경우 에디터 우측 상단의 "코드삽입" 버튼을 이용 해 주세요.
  • 마크다운 문법으로 본문을 작성 해 주세요.
  • 풀이를 읽는 사람들을 위하여 풀이에 대한 설명도 부탁드려요. (아이디어나 사용한 알고리즘 또는 참고한 자료등)
  • 작성한 풀이는 다른 사람(빨간띠 이상)에 의해서 내용이 개선될 수 있습니다.
목록으로
코딩도장

코딩도장은 프로그래밍 문제풀이를 통해서 코딩 실력을 수련(Practice)하는 곳입니다.


언어별 풀이 현황
전 체 x 33
java x 4
scala x 1
python x 13
javascript x 1
기 타 x 4
matlab x 1
cpp x 8
ruby x 1