midas+son의 크리에이티브(creative) 이야기

#pragma once
#include <iostream>

using namespace std;
/*
****문제****
어떤 자연수 n이 있을 때, d(n)을 n의 각 자릿수 숫자들과 n 자신을 더한 숫자라고 정의하자.

예를 들어

d(91) = 9 + 1 + 91 = 101

이 때, n을 d(n)의 제네레이터(generator)라고 한다. 
위의 예에서 91은 101의 제네레이터이다.

어떤 숫자들은 하나 이상의 제네레이터를 가지고 있는데, 
101의 제네레이터는 91 뿐 아니라 100도 있다. 
그런데 반대로, 제네레이터가 없는 숫자들도 있으며, 
이런 숫자를 인도의 수학자 카프이카가 셀프 넘버(self-number)라 이름 붙였다. 
예를 들어 1,3,5,7,9,20,31 은 셀프 넘버 들이다.  

1 이상이고 5000 보다 작은 모든 셀프 넘버들의 합을 구하라.

*/
//제네레이터 구하는 함수
int GeneratorCheck(int n)
{
int num = n; //첫 수
int generator = 0; //결과 제네레이터

int temp = num;    //나누고 나머지 계산할 임시변수
while (true)
{
generator += temp % 10;    //나머지는 더해주자. (1의 자리)

if (temp / 10 == 0)    //몫이 0이면 더이상 계산 할게 없는 것
{
break;
}
else
{
temp = temp / 10;    //몫이 남아 있다면 다시 나머지를 구하기 위해 몫부분만 넣어준다.
}
}
generator += num;    //마지막으로 처음 들어온 수도 더해준다.
return generator;    //제네레이터 값 리턴
}

//메인함수
void main()
{
const int maxNum = 5000 - 1; //5000미만이니 1 ~ 4999 만 체크 해도 되겠지?
//체크할 숫자 배열 변수
int* numArr = new int[maxNum];

//체크할 숫자 배열 초기화
for (int i = 0; i < maxNum; ++i)
{
numArr[i] = i + 1; //모든int배열에 값 추가
}

//제네레이터 체크
for (int i = 0; i < maxNum; ++i)
{
int g = GeneratorCheck(i + 1);
if (g < maxNum)
{
numArr[g - 1] = 0; //제네레이터 값은 0으로 값 변환
}
}

//합계산
int sum = 0;
//셀프 넘버(제네레이터가 아닌 값) 체크
for (int i = 0; i < maxNum; ++i)
{
//셀프 넘버 표시용 - 셀프넘버가 뭔지 알고 싶으면 주석 풀어요
//if (numArr[i] != 0)
//{
// cout << numArr[i] << ", ";
// sum += numArr[i]; //셀프 넘버 합
//}
//단순 합 - 0은 더해봤자 0
sum += numArr[i]; //셀프 넘버 합
}
cout << endl << "결과 합 : " << sum << endl; //결과 출력

getchar();
}

//합만 구하는게 목적일 경우 int배열이 아니라 bool배열로 false, true체크해서 for문의 int i값만 더하는게 더 가볍다.


코딩 출처 : 내 머리, 내 손