본문 바로가기
프로그래밍/알고리즘

백준 9506번: 약수들의 합

by 만디기 2024. 3. 22.

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

 

9506번: 약수들의 합

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

www.acmicpc.net

 

1) 내 답변

// 약수의 합을 구해가면서 배열에 저장한 이후, 완전수일 경우 출력하고 아니면 완전수가 아니라고 출력한다.

#include <cstdio>

int main()
{
    int n = 0, sum = 0, cnt = 0;
    int arr[50000] = {0, };
    
    while(1)
    {   
        cnt = 0;
        sum = 1;

        scanf("%d", &n);
        if ( n == -1 ) break;
        
        for ( int i = 2 ; i <= n / 2 ; i++ )
        {
            if ( n % i == 0 )
            {
                sum += i;
                arr[cnt] = i;
                cnt++;
            }
        }

        if ( n != sum )
        {
            printf("%d is NOT perfect.\n", n);
        }
        else
        {
            printf("%d = 1", n);
            for ( int j = 0 ; j < cnt ; j++ )
            {
                printf(" + %d", arr[j]);
            }
            putchar('\n');
        }
    }

    return 0;
}

 

 

2) 다른 사람의 답변

// 약수의 합 계산 이후, 해당 수가 완전수일 경우 다시 한 번 계산하면서 약수 목록을 출력한다.

#include<stdio.h>
int main(){
	int n,i,sum=0;
	while(scanf("%d",&n)){ 
		if(n==-1)break;
		for(i=1;i<n;i++)
			if(n%i==0)sum+=i;
		if(sum==n){
			printf("%d = 1",n);
			for(i=2;i<n;i++)
				if(n%i==0)printf(" + %d",i);
			printf("\n");
		}
		else printf("%d is NOT perfect.\n",n);
		sum=0;
	}
	return 0;
}

// 완전수 리스트를 꿰고 나서(...) 그 수가 들어오면 약수 리스트를 출력한다.

#include <stdio.h>
int main(){
	while(1){
		int x;
		scanf("%d", &x);
		if (x == -1) break;
		if (x == 6 || x == 28 || x == 496 || x == 8128) {
			printf("%d = 1 ", x);
			for (int i = 2; i <= x / 2; i++) {
				if (x % i == 0) printf("+ %d ", i);
			}
			printf("\n");
		}
		else printf("%d is NOT perfect.\n", x);
	}
}

# 약수를 구해 배열에 넣는데, 넣을 때 해당 약수로 입력한 n을 나눈 수도 같이 저장하고 n의 제곱근까지만 for문을 돌린다.

def yaksu(n):
    ys = {1}
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            ys.add(i)
            ys.add(n // i)
    return ys

while 1:
    n = int(input())
    if n == -1: break
    ys = yaksu(n)
    if sum(ys) == n:
        print(n, "= ", end="")
        print(*sorted(list(ys)), sep=" + ")
    else:
        print(n, "is NOT perfect.")

'프로그래밍 > 알고리즘' 카테고리의 다른 글

백준 2581번: 소수  (0) 2024.03.31
백준 1978번: 소수 찾기  (0) 2024.03.22
백준 2501번: 약수 구하기  (0) 2024.03.20
백준 5086번: 배수와 약수  (0) 2024.03.15
백준 2903번: 중앙 이동 알고리즘  (0) 2024.02.27