본문 바로가기

백준

4673)셀프 넘버

https://www.acmicpc.net/problem/4673


셀프 넘버란 d(n)로 만들 수 없는 수를 말한다. (n은 자연수)


셀프 넘버를 얻을 수 있는 함수는 제시되지 않았기 때문에 함수를 직접 찾거나


d(n)으로 만들 수 있는 수를 모두 체크하고 체크되지 않은 수가 셀프 넘버일 것이다.


1~9999까지 수를 d()에 넣는다 쳐도 빠짐없이 10000 미만의 d()으로 만들 수 있는 수를 모두 확인한게 맞을까? 


d(n)으로 만들 수 있는 수들도 자연수이고 10000 미만인것만 다룰 것이기 때문에 모두 확인할 수 있다.


d(n)가 수를만들면 그 수로 set[]을 인덱싱하여 체크하면 된다.


1~10000까지 작업이 끝나면 set[]에서 체크되지 않은 인덱스들을 출력하면 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include<stdio.h>
#define CHECKED 1
 
int set[10036];
 
int d(int n) {
    int Q1, Q2, Q3;
    int R1, R2, R3;
    int d;
    d = n;
    if (n >= 1000) {
        Q1 = n / 1000; R1 = n % 1000;
        Q2 = R1 / 100; R2 = R1 % 100;
        Q3 = R2 / 10; R3 = R2 % 10;
        d += Q1 + Q2 + Q3 + R3;
    }
    else if (n >= 100) {
        Q1 = n / 100; R1 = n % 100;
        Q2 = R1 / 10; R2 = R1 % 10;
        d += Q1 + Q2 + R2;
    }
    else if (n >= 10) {
        Q1 = n / 10; R1 = n % 10;
        d += Q1 + R1;
    }
    else {
        d += n;
    }
    return d;
}
 
void findSelfNumber(int n) {
    for (int i = 1;i<10000;i++) {
        set[d(i)] = CHECKED;
    }
    for (int i = 1; i < 10000;i++) {
        if (set[i]!=CHECKED) {
            printf("%d\n",i);
        }
    }
}
 
int main() {
    findSelfNumber(10000);
 
    return 0;
}
cs

 

n의 각 자리 수를 더하기 위해 n이 몇 자리 수 인지 일일이 비교했는데 더 간단한 코드가 있었다.


1
2
3
4
5
d=n;
while(n!=0){
    d+=n%10;
    n/=10;
}

cs


유용하게 잘 써먹어야지.

'백준' 카테고리의 다른 글

1065)한수  (0) 2019.01.14
1012)유기농 배추  (0) 2019.01.13
2839)설탕 배달  (0) 2019.01.10
10773)제로  (0) 2019.01.09
1476)날짜 계산  (0) 2019.01.08