title: “백준 4673번 셀프 넘버” categories:

  • CspecialCharspecialChar

    #백준 4673번 셀프 넘버 : 네이버 블로그

백준 셀프 넘버 문제이다

일단 셀프 넘버란

생성자가 없는 숫자이다

생성자란 음…

20을 자기 수+각 자리의 수를 하면 20+2+0으로 22가 된다

이 때 22의 생성자는 20이 된다

즉 어떠한수의 어떠한수+어떠한수의 각자리수=결과값

여기서 결과값의 생성자는 어떠한수가 됩니다

그리고 이 생성자가 없는 수가 셀프넘버입니다

셀프넘버를 구하기 위해서는

생성자가 있는 수를 구하고 전체 수에서 생성자가 있는 수를 빼면 됩니다

수의 범위는 1000의 자리까지

즉 10000미만입니다

필자는 배열에 각 수를 넣고 이 수가 1의 생성자인가? 2의생성자인가 3의 생성자인가…이렇게 하나하나 대조했습니다

#include
#define MaxNum 10000
using namespace std;
int ToResultNum(int InputNum) {
 int ResultNum = InputNum;
 for (int i = 0; i < 4; i++)
 {
 ResultNum = ResultNum + InputNum % 10;
 InputNum = InputNum / 10;
 }
 return ResultNum;
}
int main(){
 int list[MaxNum];
 for (int i = 0; i < MaxNum; i++)
 {
 list[i] = i;
 }

 for (int i = 0; i < MaxNum; i++)
 {
 for (int q = 0; q < MaxNum; q++)
 {
 if (i == ToResultNum(q))
 list[i] = 0;
 }
 if (list[i])
 cout << i << endl;
 }
}

ToResultNum함수는 입력받은수를 입력받은수+각 자리수해서 결과값을 리턴합니다

각 자리수를 계산하는 방식은

InputNum%10을 하면 10이하의 나머지. 즉 일의자리가 나오고

이것을 /10을 하고 %10을 하면 원래 수의 십의자리가 나옵니다(나누기로 자릿수를 낮추므로)

반복 4번은 1000의 자리를 계산하기 위함입니다

즉 1234가 입력되면

1234%10=4

1234/10=123

123%10=3

123/10=12

12%10=2

12/10=1

1%10=1

%10한 값을 모두 더하면 천의자리 백의자리 십의자리 일의자리를 더할 수 있습니다

또한 입력된 수가 자릿수가 일의자리든 백의자리든 나누기를 하면 0이 되므로 입력값이 자리수에 상관없이 값을 구할 수 있습니다

main 안의 내용은

list[MaxNum] 배열을 선언합니다

그리고 for문을 중첩해서

list[i]가 결과값과 같은지 비교합니다

(결과값은 하나씩 올라가는 q, 즉 생성자입니다. 결과값은 생성자로부터 만들어진 결과값)

결과값과 같으면 셀프넘버가 아니므로(생성자에 만들어진 결과값이 있으므로)

list[i]에 0을 넣습니다

반복이 끝나고

if(list[i)

cout«list[i]«endl

list[i]가 true이면 (0이 아니면)

list[i[를 출력합니다

업데이트: