알고리즘

[Python & SQL] 완전수 판별하기

LeeSeunghyuk 2020. 12. 30. 10:04
반응형

안녕하세요.

이승혁입니다.

 

오늘은 완전수인지 판별하는 알고리즘을 구현해 보겠습니다.

 

### 완전수 ?

 

     자신을 제외한 약수들의 합과 자신이 같은 수입니다.

     6의 약수는 1, 2, 3, 6 입니다.

     자신인 6을 제외한 1 + 2 + 3 = 6 

     따라서 6은 완전수 입니다.

 

     전에 약수를 구하는 코드는 구현을 했습니다!

     그 코드를 사용해서 쉽게 완전수를 판별할 수 있습니다.

 

 

 

# 약수 구하는 코드

 

2020/12/28 - [알고리즘] - [Python & SQL] 약수 구하기

 

[Python & SQL] 약수 구하기

안녕하세요 알고리즘 첫 번째 게시물 입니다. 입력받은 숫자 혹은 숫자 자료의 약수를 구하는 방법을 알아보도록 하겠습니다. ※ 약수(divisor) ?  divide : 나누다 + or : 미사  즉, 해석하면 " 나누는

lsh-story.tistory.com

 

 


### Python 완전수 판별 코드

 

수 입력 받습니다.

약수를 리스트로 구합니다.(자기자신 제외)

약수의 합을 저장합니다.

입력받은 수와 약수의 합을 비교합니다.

 

# 완전수 알고리즘
num=int(input('완전수를 판별합니다. 숫자를 입력하세요 : '))

divisor=[i for i in range(1,num) if num%i==0]

result=sum(divisor)

if result==num:
    print('%d : 완전수입니다.'%num)
else:
    print('%d : 완전수가 아닙니다.'%num)

 

입력 받지 말고, 범위에서 완전수를 찾는 코드도 구현해 보았습니다.

for i in range(2,1000): # 2 ~ 99까지
    
    divisor=[j for j in range(1,i) if i%j==0]
    result=sum(divisor)
    
    if result==i:
        print('완전수:%d'%i)
        print('약수 : %s\n'%divisor)      

 

### SQL 완전수 판별 코드

 

accept num prompt '완전수를 판별합니다. 숫자를 입력하세요'
with divisor_table as ( select level as 약수
                         from dual
                         where mod(&&num,level)=0
                         connect by level<&&num)
                         
select case when sum(약수)=&&num then listagg(약수,'+')||'='||sum(약수)||' 완전수입니다.'
                                else listagg(약수,'+')||'='||sum(약수)||' 완전수가 아닙니다.'
                                end "완전수 판별하기"
from divisor_table;

 

 

 

# 완전수 범위로 찾는 쿼리

accept num prompt '완전수를 판별합니다. 범위를 입력하세요'
with num_table as ( select level as 수
                         from dual
                         connect by level<=&&num
                         order by 수)
                         
select '완전수 :'||n1.수||'     <'|| listagg(n2.수,'+')||'>' 완전수찾기
from num_table n1, num_table n2
where mod(n1.수,n2.수)=0 
group by n1.수
having n1.수=sum(n2.수)-n1.수
order by 1;

 

반응형