constWORLDant

[진짜 1도 모르는 PYTHON] 함수 연습 본문

0x09 PYTHON_Tutorial

[진짜 1도 모르는 PYTHON] 함수 연습

data type ConS_tanT 2017.12.18 23:24

#-*-coding:utf-8-*-

import sys


'''

셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다.


양의 정수 n이 주어졌을 때, 이 수를 시작해서 n, d(n), d(d(n)), d(d(d(n))), ...과 같은 무한 수열을 만들 수 있다. 


예를 들어, 33으로 시작한다면 다음 수는 33 + 3 + 3 = 39이고, 그 다음 수는 39 + 3 + 9 = 51, 다음 수는 51 + 5 + 1 = 57이다. 이런식으로 다음과 같은 수열을 만들 수 있다.


33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141, ...


n을 d(n)의 생성자라고 한다. 위의 수열에서 33은 39의 생성자이고, 39는 51의 생성자, 51은 57의 생성자이다. 생성자가 한 개보다 많은 경우도 있다. 예를 들어, 101은 생성자가 2개(91과 100) 있다. 


생성자가 없는 숫자를 셀프 넘버라고 한다. 100보다 작은 셀프 넘버는 총 13개가 있다. 1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, 97


10000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 출력하는 프로그램을 작성하시오.

'''


#유의사항 : 함수를 사용할 것

# PYTHON은 def를 사용한다

# 함수를 사용하면 프로그램 흐름을 보기 편하다 

# 참고로 알게 된 것은 여러 개의 입력 값을 받는 함수는 *가변인자를 이용하여 만들 수 있다.

'''

예시

def sum_many(*args):

sum = 0

for i in args:

sum = sum + i

return sum

'''

#list 생성

set_arr = [] # 1~10000까지 들어 있음

check = []  # 한번이라도 언 급 된 숫자들 

get_arr = []

#initalized

TWICE =2

TEN = 10

HUND =100

THOU = 1000

temp = 0 # 실제 값 잠시 보관 

original = 0

changable = 0

########  함수 정의  #########

def setting_array():

for i in range (1,10001):

set_arr.append(i) # i값이 계속 들어가겠지

return set_arr


def decide_number(original):

temp = original

# original값 우선 리스트에 삽입

#append함수는 리스트 맨 뒤에 차곡차곡 값을 추가 하는 것

#insert함수는 특정 위치 지정해서 값을 추가 하는 것

if(original >=2 and original < 10): #1의 자리면

changable = original * TWICE  # 자기 자신을 2번 곱하면 됨

check.append(changable)

elif(original >= 10 and original < 100): #10의 자리면

changable = original + (original / TEN) + (original % TEN)

check.append(changable)

elif(original >= 100 and original < 1000): #100의 자리면

changable = original + (original/ HUND) + ((original%HUND)/TEN) \

+ ((original%HUND)%TEN)

check.append(changable)

elif(original >=1000 ):

changable = original + (original / THOU) + ((original%THOU)/HUND) \

+ (((original%THOU)%HUND)/TEN) + ((original%THOU)%HUND)%TEN

check.append(changable)

return check

#######프로그램 시작######

setting_array()

for i in range (1,10001):

original = i #계속 증가하는 i값

decide_number(original)


if(temp > changable): # changable이 temp보다 작으면 

print '이럴 수가 있는거니?'

sys.exit(-1)

# 다 돌고 나면 check list에 목록들이 있을 거임 

# 그렇다면 defaulted에서 check list에 있는 숫자들을 제외 하자 

# python 에는 차집합 합집합 이러한 집합을 만들 수 있다고 한다

# set function 이용 list를 set으로 변환 해야 함 

# 여기서는 defaulted와 check 둘 다 포함 되는것을 뺄 것이니 '차집합' 이용 

get_arr = list(set(set_arr) - set(check))

# 그 후 list를 오름차순으로 

get_arr.sort()

print ( get_arr )


0 Comments
댓글쓰기 폼