- 자기 자신과 각 자릿수를 더하는 함수를 구현하고, 자기 자신에 대한 생성자가 없는 넘버를 셀프 넘버라고 한다.
여기서 생각해볼 점은 오류를 방지하려면 리스트 공간을 10000개가 아니라 더 크게 만들고 코드를 안전하게 짜도 무방해보인다.
#flag를 꽂을 리스트 10000개
num_list = [True for i in range(1, 10001)]
# 각 자릿수 이므로 몇 자릿 수인지 판별
def d(n):
while True:
num = 0
#1의 자릿수일 떄,
if n // 10 == 0:
num = n + n
num_list[num] = False
break
# n이 10의 자릿수 일 때,
elif n // 100 ==0:
num = n + (n //10)%10 + n%10
num_list[num] = False
break
# n이 100의 자릿수 일 때,
elif n // 1000 ==0:
num = n + (n//100)%10 +(n //10) %10 + n%10
num_list[num] = False
break
# n이 1000의 자릿수 일 때, 9999를 넣으면 10000을 넘는 것 예외처리
elif n // 10000 ==0:
num = n + (n//1000)%10 + (n//100)%10 +(n //10) %10 + n%10
if num >= 10000:
break
else:
num_list[num] = False
break
elif n ==10000:
num_list[num] = False
break
for i in range(1, 10001):
d(i)
result_list = list(filter(lambda x: num_list[x] == True, range(len(num_list))))
for i in result_list:
print(i)
list_num = set(range(1, 10001))
new_num = set()
for i in range(1, 10001):
for j in str(i): #각 자릿수를 문자 단위로 쪼갬. 850이면, 8 5 0
i +=int(j) # i 와 다시 int로 변환한 각 자릿수.
new_num.add(i)
result_num = sorted(list_num - new_num) # 원래 배열에서 생성자가 있는 수를 차집합으로 지움.
for i in result_num:
print(i)