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; } |
유용하게 잘 써먹어야지.
'백준' 카테고리의 다른 글
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 |