완전수 구하기

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

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

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

67개의 풀이가 있습니다. 1 / 7 Page

파이썬 3로 짧게 구현해봤습니다.

num= int(input("숫자를 입력하시오 : "))
print([x for x in range(1, num+1) if x==sum(y for y in range(1, x) if x%y==0)])
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
#include <stdio.h>
#include <math.h>

int perfect_num(int n) {
    int i, sum = 1;
    for (i = 2; i <= (int)sqrt(n); i++) {
        if ((n%i == 0) && (n/i != i)) sum += (i+n/i);
        else if ((n%i == 0) && (n/i == i)) sum += i;
        else continue;
    }
    if (sum == n) return 1;
    else return 0;
}

int main()
{
    int i, n;
    scanf("%d", &n);
    for (i = 2; i <= n; i++) { if (perfect_num(i) == 1) printf("%d\n", i); }
    return 0;
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
#-*- coding: utf-8 -*-

#1 부터 n 까지
#n 값이 커질수록 좀 오래걸립니다..


#풀이방법 1  평범함
n =1000
result =  [ c for c in xrange(1, n) if sum(x for x in xrange(1,c) if not c%x) == c]



#풀이방법 2 필터와 람다를 써보자(뭔가 아름다워보임!! 지림)
n =1000
#하하핫 죄송하지만 1번보다 이게 더 빠르다구욧!
beyond_if = list(filter(lambda c: sum(x for x in xrange(1,c) if not c%x) == c,range(1,n)))



#풀이방법 3  윗 방법들의 뼈대입니다 . 풀이방법 3을 코드리뷰해서 풀이방법 1,2를 만들었습니다 :P
n =1000
for c in xrange(1, n):
    if sum(x for x in xrange(1,c) if not c%x) == c:
       print c

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
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;
        }
    }
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
# pnumber.py

n = int(input("자연수 입력 > "))
result = 0

for i in range(1,n+1):

    for j in range(1,i):
        if i%j==0:
            result += j
    if result == i:
        print("%d "%(result),end=' ')
    result = 0
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

c언어로 했습니다

#include<stdio.h>

int main(void)
{
 int a,i,j,sum;

 printf("정수를 입력하세요.\n");
 scanf("%d",&a);
 for(i=1;i<=a;i++)
 {
      sum=0;
     for(j=1;j<i;j++)
       if((i%j)==0)
           sum+=j;
      if(i==sum)
           printf("완전수는 %d\n",i);
     }
     return 0;

}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
//자연수 받아서 그이하의 완전수 출력
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번째 완전수 부턴 이방식으로는 콘솔에선 안나오더라구요!

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

비주얼 스튜디오에서 c언어로 짜봤습니다

#include <stdio.h>


int main() {
    int N, i, j;
    int a = 0;
    printf("완전수를 구하는 프로그램...\n\n");
    getchar();

    printf("자연수 N 을 입력하세요.");
    scanf_s("%d", &N);
    printf("N 이하의 완전수는 \n");
    for (i = 1; i <= N; i++) {
        for (j = 1; j < i; j++) {
            if (i%j == 0)a += j;
        }
        if (a == i)printf("%d\t", i);
        a = 0;
    }
    puts("\n");
    return 0;
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
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);
        }

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

파이썬3입니다. 박시우님 답을 보니 제가 너무 복잡하게 풀었네요~ㅠㅠ

num = int(input('자연수를 입력하시오: '))
print([sum(i[0:-1]) for i in [[ z for z in range(1, y+1) if y % z ==0 ] for y in [ x for x in range(1,num+1) ]] if sum(i[0:-1]) == i[-1]])
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

풀이 작성

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

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


언어별 풀이 현황
전 체 x 67
java x 8
scala x 1
python x 22
javascript x 2
cs x 1
기 타 x 14
matlab x 2
cpp x 15
r x 1
ruby x 1