반응형
SMALL
N > 0 , D[N] 생성자 , // 생성자가 없는 수는 셀프넘버임 -> 100이하의 셀프넘버는 13개가 존재함
D[n] -> n + n/10 + n%10
n = d[n]-n/10 -n%10
ex ) 75 + 7 +5 = 87 -> 87+8+7 -> 102 -> 102+1+0+2
1. 생성자 n -> 1~10000으로 수열 D[N]을 구성.
2. D[n]은 dn += n%10 , n = n/10 의 반복으로 획득 -> n = 0 이거나 n < 0까지 반복 ,
3. D[N]=X 의 값을 인덱스로 사용하요 D[X]=1로 체크
4 D[N] = 0 인경우 출력
C
#include <stdio.h>
#define limite 10000
#define max_dn 10035
#define check 1
#define non_check 0
int make_dn(int num);
int main()
{
int i= 0;
int d[max_dn] = { 0, };
int reg = 0;
for( i =1 ; i<=limite ; i++)
{
reg= make_dn(i);
d[reg] = check;
}
for( i =1; i<= limite ; i++)
{
if( d[i] == non_check ) printf("%d\n", i);
}
return 0;
}
int make_dn(int num)
{
int sum =num;
while(num>0)
{
sum += num%10;
num = num/10;
}
return sum;
}
C++
#include <iostream>
#define limite 10000
#define max_dn 10035
#define check 1
#define non_check 0
using namespace std;
int make_dn(int num);
int main()
{
int i= 0;
int d[max_dn] = { 0, };
int reg = 0;
for( i =1 ; i<=limite ; i++)
{
reg= make_dn(i);
d[reg] = check;
}
for( i =1; i<= limite ; i++)
{
if( d[i] == non_check ) cout << i<< endl;
}
return 0;
}
int make_dn(int num)
{
int sum =num;
while(num>0)
{
sum += num%10;
num = num/10;
}
return sum;
}
python
def selfnum(n):
return n+sum([int(i) for i in str(n)])
arr = [0]*10000
for i in range(100000):
if(selfnum(i)<10000):
arr[selfnum(i)]=1
for i in range(10000):
if arr[i] == 0:
print(i)
2. set 사용
set : 자료형의 중복을 제거하기 위한 필터역할
raw_num = set(range(1,10001))
gener_num = set()
#ex) i = 123
# j = 1 , 2, 3
# i = i+1+2+#
for i in range(1,10001):
for j in str(i):
i += int(j)
gener_num.add(i) # 생성자 숫자
self_num = sorted(naw_num - gener_num)
for i in self_num:
print(i)
반응형
LIST
'programming > 알고리즘 풀이' 카테고리의 다른 글
백준-문자열 [C/C++/PYTHON] #11654 (0) | 2021.12.10 |
---|---|
백준- 함수 #15596 - 정수 N개의 합 #1065- 한수 [C/C++/PYTHON] (0) | 2021.12.01 |
백준 1546 -[C/C++/PYTHON] 1차원배열 (0) | 2021.11.29 |
백준 4344번 - [C,C++,Python] 1차원배열 (0) | 2021.11.29 |
백준 10951번- [C/C++/Python] while문 (0) | 2021.11.29 |