https://www.acmicpc.net/problem/4673
4673번: 셀프 넘버
셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때,
www.acmicpc.net
실버티어 문제로 넘어오면서 머리가 정말 아프다;;
각설하고, 이번 문제는 어느 수학자가 정의한 셀프넘버에 관한 문제이다. n이라는 자연수에 대해 자기자신과 자기자신의 자리수를 합하는 함수 d(n)이라고 하자(이때의 n을 생성자라고 한다). d(75) = 75+7+5 = 87이 된다.
또한 셀프 넘버는 d(n)을 통해 나올 수 없는, 즉 생성자가 없는 숫자를 의미한다. 대표적으로 1, 3, 20 이 있다.
이 문제는 10000이하의 셀프 넘버를 모두 찾아 출력하는 문제이다.
처음에는 d(n)을 역연산하여 생성자를 찾아볼까 생각했지만, 매우 힘들 것이라는 판단을 하여, d(n)으로 산출된 값을 지우는 방식을 택했다.
#include <stdio.h>
int d (int num) {
int dnum;
int a,b,c,d; // 천, 백, 십, 일의 자리수
if (num > 0 && num < 10) {
dnum = 2*num;
} else if(num >= 10 && num < 100) {
c = num / 10;
d = num % 10;
dnum = num + c + d;
} else if(num >= 100 && num < 1000) {
b = num / 100;
c = (num / 10) % 10;
d = num % 10;
dnum = num + b + c + d;
} else if(num >= 1000 && num < 10000) {
a = num / 1000;
b = (num / 100) % 10;
c = (num / 10) % 10;
d = num % 10;
dnum = num + a + b + c + d;
}
return dnum;
}
int main(){
int t[10000] = {0,}; // 1만개의 숫자
int n = 1; // 생성자
while (n <= 10000) {
if (d(n) <= 10000){
t[d(n)-1] = 1; // d(n)으로 생성되었으므로 셀프넘버가 아님
}
n++;
}
for (int i = 0; i < 10000; i++) {
if (t[i] == 0) { // 배열의 요소가 0이라는 것은 곧 셀프넘버라는 뜻
printf("%d\n", i+1);
}
}
return 0;
}
'coding_test > BAEKJOON' 카테고리의 다른 글
백준 10809번 C언어 풀이 (0) | 2021.08.07 |
---|---|
백준 1065번 C언어 풀이 (0) | 2021.08.06 |
백준 15596번 C언어 풀이 (0) | 2021.08.05 |
백준 4344번 C언어 풀이 (0) | 2021.08.05 |
백준 8958번 C언어 풀이 (0) | 2021.08.05 |