완전수 구하기

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

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

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

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

#include <iostream>
#include <cmath>

using namespace std;

bool isPerfectNum(int number);

int main()
{
    int input;

    cin >> input;
    for (int i = 2; i <= input; i++) {
        if (isPerfectNum(i)) {
            cout << i << endl;
        }
    }

    return 0;
}

bool isPerfectNum(int number)
{
    int sum = 0;
    int until = sqrt(number);

    for (int i = 2; i <= until; i++) {
        if (number % i == 0) {
            if (i * i != number) {
                sum += number / i;
            }
            sum += i;
        }
    }

    return (sum + 1) == number;
}

c++ 로 작성해봤습니다.

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
% in matlab
N=input('자연수를 입력해주세요 : ');
P=[];
for n1=1:N;
    K=[1];
    for n2=2:n1;
        a1=n1/n2-floor(n1/n2);
        if a1==0;
            K=[K n2];
        end
    end
    K(end)=0;
    a2=sum(K);
    if a2==n1
        P=[P a2];
    end
end
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
import sys

number_input = int(sys.argv[1])

def isPerfectNumber(number):
    divisor = []
    for step in range(1, int(number/2)+1):
        if number % step == 0:
            divisor.append(step)
    if number == sum(divisor):
        return True
    return False


perfect_numbers = []
for number in range(1, number_input+1):
    if isPerfectNumber(number):
        print("%d is perfect number" % number)
        perfect_numbers.append(number)
    else:
        print("%d is no perfect number" % number)

print("perfect numbers found :", perfect_numbers)

OUTPUT 십만(100000)이하의 숫자에 대해서 모두 조사했는데 4개뿐이네요 perfect numbers found : [6, 28, 496, 8128]

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
# 1
n = int(input("Input number : "))
divisors = []
for i in range(1, n + 1):
    divisors_sum = []
    for j in range(1, i):
        if i % j == 0:
            divisors_sum.append(j)
    if sum(divisors_sum) == i:
        divisors.append(i)

print divisors

# 2 (박시우님 코드 보고 다시)
print list(filter(lambda i: sum(j for j in range(1, i) if i % j == 0) == i, range(1, n)))
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
public class test{

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        System.out.print("Input: ");

        int num = sc.nextInt();

        find_perfectnumder(num);
    }

    public static void find_perfectnumder(int s){

        List<Object> smallarray = new ArrayList<Object>();
        int count_smallnum=0;
        int size = s;
        int tail = 0;   
        int total=0;

        for(int i=1; i <= size; i++){
            for(int j = 1; j < i; j++){

                tail = i%j;
                if(tail==0  ){

                    smallarray.add(count_smallnum,j);
                    count_smallnum++;

                }

            }

            for(int k=0; k <  count_smallnum; k++){

                total += (int) smallarray.get(k);

            }
            if(total == i){
                System.out.printf("Perfect number is = %d  \n",total);
            }
            count_smallnum=0;
            total = 0;

        }

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

자기 자신을 제외한 모든 양의 약수들의 합이 자기 자신이 되는 자연수를 완전수라고 한다.
예를 들면, 6과 28은 완전수이다. 6=1+2+3 // 1,2,3은 각각 6의 약수 28=1+2+4+7+14 // 1,2,4,7,14는 각각 28의 약수
입력으로 자연수 N을 받고, 출력으로 N 이하의 모든 완전수를 출력하는 코드를 작성하라.

*/

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

#include <iostream>
#include <stdlib.h>

using namespace std;

const int INPUT_NUMBER_MAX = 10000;

int main(void)
{
    int inputNumber = -1;
    int capacityPerfect = 0;
    int* perfectNumber = new int[0];

    cout << "숫자를 입력하세요(1~10000) : ";
    cin >> inputNumber;
    if (inputNumber >= 1 && inputNumber <= 10000)
    {
        for (int i = 1; i <= inputNumber; i++)
        {
            int* measureNumber = new int[0];
            int addNumber = 0;
            int devideNumber = 1;
            int capacity = 0;
            for (devideNumber; devideNumber*devideNumber < i; devideNumber++)
            {
                if (i%devideNumber == 0)
                {
                        int* temp = new int[capacity];
                        for (int j = 0; j < capacity; j++)
                        {
                            temp[j] = measureNumber[j];
                        }
                        delete[] measureNumber;

                        capacity += 2;

                        measureNumber = new int[capacity];
                        for (int j = 0; j < capacity - 2; j++)
                        {
                            measureNumber[j] = temp[j];
                        }
                        measureNumber[capacity - 2] = devideNumber;
                        measureNumber[capacity - 1] = i / devideNumber;
                        delete[] temp;
                }
            }
            if (devideNumber*devideNumber == i)
            {
                int* temp = new int[capacity];
                for (int j = 0; j < capacity; j++)
                {
                    temp[j] = measureNumber[j];
                }
                delete[] measureNumber;

                capacity++;

                measureNumber = new int[capacity];
                for (int j = 0; j < capacity - 1; j++)
                {
                    measureNumber[j] = temp[j];
                }
                measureNumber[capacity - 1] = devideNumber;
                delete[] temp;
            }
            for (int j = 0; j < capacity; j++)
            {
                addNumber += measureNumber[j];
            }
            if ((addNumber-i) == i)
            {
                int* temp = new int[capacityPerfect];
                for (int j = 0; j < capacityPerfect; j++)
                {
                    temp[j] = perfectNumber[j];
                }
                delete[] perfectNumber;

                capacityPerfect++;

                perfectNumber = new int[capacityPerfect];
                for (int j = 0; j < capacityPerfect - 1; j++)
                {
                    perfectNumber[j] = temp[j];
                }
                perfectNumber[capacityPerfect - 1] = i;
                delete[] temp;
            }
            delete[] measureNumber;
        }
        for(int i = 0 ; i < capacityPerfect ; i++)
        { 
            cout << perfectNumber[i] << endl;
        }
        return 0;
    }
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
#include <iostream>
using namespace std;

int main()
{
    int N;  // 입력받을 자연수
    cout << "자연수를 입력하세요  ";
    cin >> N;
    if (N <= 0)
    {
        cout << "자연수가 아닙니다. 다시 입력해주세요.  ";
        cin >> N;
    }
    for (int i = 2; i <= N; i++)    //입력받은 자연수 보다 작은 자연수 확인
    {
        int sum = 0;
        for (int j = 1; j < i; j++) // 자연수의 약수 확인
        {
            if (i%j == 0)   // 약수이면
            {
                sum += j;   
            }
        }
        if (sum == i)       // 완전수인지 확인
            cout << i << " ";
    }

    return 0;
}


※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
n = input("Enter number: ")
sum_num = 0

for number in range(1, n+1):
    for num in range(1,number):
        if number%num == 0:
            sum_num += num
    if number == sum_num:
        print(number)
    sum_num = 0
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
N = input("숫자를 입력하세요: ")

def is_perfect(n):
    if n == sum_divisor(n):
        return True
    else:
        return False
def sum_divisor(x):
    i = 0
    for k in range(1,x):
        if x%k == 0:
            i = i + k
    return i

per_list=[]
for num in range(1, int(N)+1):
    if is_perfect(num):
        per_list.append(num)

print(per_list)
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def perfect_number(n):
    div=[]
    for i in range(1,n):
        if n%i==0:
            div+=[i]
    if sum(div)==n:
        return 1
    else:
        return 0
def main(n):
    result=[]
    for i in range(n):
        if perfect_number(i+1)==1:
            result+=[i+1]
    print(result)
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

풀이 작성

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

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


언어별 풀이 현황
전 체 x 62
java x 7
기 타 x 12
scala x 1
python x 21
javascript x 1
cs x 1
r x 1
matlab x 2
cpp x 15
ruby x 1