[코딩문제]셀프 넘버(self-number) 풀이
공부/c++(c, STL)2016. 6. 18. 20:52
#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값만 더하는게 더 가볍다.
코딩 출처 : 내 머리, 내 손
'공부 > c++(c, STL)' 카테고리의 다른 글
[코딩문제]계단 오르기 - 3 계단 (0) | 2016.06.23 |
---|---|
[코딩문제]피보나치 수열 (0) | 2016.06.20 |
[코딩문제]문자열 거꾸로 출력 (0) | 2016.06.16 |
C++11 람다 식 (0) | 2016.06.10 |
Vector의 역순 검색, 역 반복자(reverse_iterator) (0) | 2016.02.07 |