어떤 자연수 n이 있을 때, **d(n)을 n의 각 자릿수 숫자들과 n 자신을 더한 숫자**라고 정의하자.
ex> d(91) = 9 + 1 + 91 = 101
이 때, n을 d(n)의 제네레이터(generator)라고 한다. 위의 예에서 91은 101의 제네레이터이다.
어떤 숫자들은 하나 이상의 제네레이터를 가지고 있는데, 101의 제네레이터는 91뿐 아니라 100도 있다. 그런데 반대로, 제네레이터가 없는 숫자들도 있으며, 이런 숫자를 인도의 수학자 Kaprekar가 셀프 넘버(self-number)라고 이름 붙였다. 예를 들어 1, 3, 5, 7, 9, 20, 31은 셀프 넘버 들이다.
1이상이고 5000 보다 작은 모든 셀프 넘버들의 합을 구하라.
일단 d(n)을 손으로 쭉 뽑아보면...
d(1) = 1 + 1 = 2
d(2) = 2 + 2 = 4
d(3) = 3 + 3 = 6
d(4) = 4 + 4 = 8
d(5) = 5 + 5 = 10
d(6) = 6 + 6 = 12
d(7) = 7 + 7 = 14
...
결과 값과 빠진 수를 표시 해 보면
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ...
- 1. d(n)이 5000이 될 때까지 구한다.
- 2. 1에서 5000까지의 숫자중에서 d(n) 값을 비교하여 빠진 숫자들을 찾아낸다. (어떻게???)
- 3. 빠진 숫자들을 더한다.
일단은 1번까지만...
objective-C
#import <Cocoa/Cocoa.h>
int main(int argc, const char * argv[ ]) {
int n, temp, d[5001]={};
n = 1;
temp = 1;
while (d[n] < 5000) {
temp = n;
while (temp > 0) {
d[n] = d[n] + (temp % 10);
temp = temp / 10;
}
d[n] = d[n] + n;
printf("d[%d] = %d\n", n, d[n]);
n = n + 1;
}
return NSApplicationMain(argc, argv);
}
2번은 어떻게 해결을 해볼까? 싶어서 고민을 해봤는데 역시나 무식하게 제일 쉽고 편하 방법 같아서...(역시 무식한게 빠르고 편한???)
1 ~ 5000까지 일일이 d(n) 값과 비교를 해보고 이중에 같은 값이 없으면 따로 표시를 해주는 방식으로 만든 다음 그 표시된 값이 있는 d(n) 값을 일일이 더해주는 방법을 써보기로 하였다.
objective-C
#import <Cocoa/Cocoa.h>
int main(int argc, const char * argv[]) {
int n, temp, sum_of_selfnumber, selfnumber_check, d[5001] = {}, generator;
n = 1;
temp = 1;
generator = 0;
while (generator < 5000) {
temp = n;
while (temp > 0) {
d[n] = d[n] + (temp % 10);
temp = temp / 10;
}
d[n] = d[n] + n;
generator = d[n];
printf("d[%d] = %d\n", n, d[n]);
n = n + 1;
}
n = 1;
temp = 1;
generator = 0;
sum_of_selfnumber = 0;
printf("\n");
while (n <= 5000) {
while (generator < 5000) {
generator = d[temp];
if (n == generator) {
selfnumber_check = 1;
}
else {
selfnumber_check = 0;
}
temp = temp + 1;
}
if (selfnumber_check == 0) {
sum_of_selfnumber = sum_of_selfnumber + n;
}
n = n + 1;
}
printf("%d", sum_of_selfnumber);
return NSApplicationMain(argc, argv);
}
뭔가 대단히 씔대없이 길어진 느낌이다. 근데 실행을 해보니 답이 틀리게 나온다. 망할~~ 좀 더 공부해야겠다...