일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- LIS #가장긴증가하는부분수열 #
- C++
- 최소 #공배수 #최대 #공약수 #유클리드 #호제법 #lcm #gcd #c++ #boj #3343 #백준 #장미
- graph
- 3343
- BOJ
- 호반우 상인
- c++ #boj #
- backtracking #codetree #디버깅 #삼성코테
- c++ #입출력 #속도 #ios #sync_with_stdio #cin #cout #tie
- 이분탐색 #dp #11053
- 22869
- boj #백준
- 30870
- 레드아보
- 백준 #다익스트라 #dijkstra #9370 #c++
- 백준
- 사이클 없는 그래프
- graph #최단경로
- 투포인터 #백준 #boj #20922 #22862
- 진법변환 #2to10 #10to2 #이진법 #십진법 #변환 #bitset #c++
- 3D #Reconstruction #computer #vision #volume #metric #tsdf #kinect #fusion
- 16202
- N번째큰수
- 쌤쌤쌤
- 코딩
- 줄어드는수
- 20117
- 1174
- hcpc
- Today
- Total
hyunjin
[4673][c]셀프 넘버 본문
문제
셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다.
양의 정수 n이 주어졌을 때, 이 수를 시작해서 n, d(n), d(d(n)), d(d(d(n))), ...과 같은 무한 수열을 만들 수 있다.
예를 들어, 33으로 시작한다면 다음 수는 33 + 3 + 3 = 39이고, 그 다음 수는 39 + 3 + 9 = 51, 다음 수는 51 + 5 + 1 = 57이다. 이런식으로 다음과 같은 수열을 만들 수 있다.
33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141, ...
n을 d(n)의 생성자라고 한다. 위의 수열에서 33은 39의 생성자이고, 39는 51의 생성자, 51은 57의 생성자이다. 생성자가 한 개보다 많은 경우도 있다. 예를 들어, 101은 생성자가 2개(91과 100) 있다.
생성자가 없는 숫자를 셀프 넘버라고 한다. 100보다 작은 셀프 넘버는 총 13개가 있다. 1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, 97
10000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 출력하는 프로그램을 작성하시오.
입력
입력은 없다.
출력
10,000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 증가하는 순서로 출력한다.
<풀이>
https://1jeemae.blog.me/221355238464
https://blog.naver.com/compa513/221434868690
selfnum를 체크하기 위한 배열을 만들고
1부터 쭉 selfnum을 만들고 거기서 파생될 수 있는 수들의 selfnum배열의 값을 1로 준다.
#makeSelfnum 함수
인자로 받은 수를 가지고 1000이하의 selfnum을 파생시켜 만들기
여기서 핵심 각 자리의 수를 어떻게 뽑아내는가?
-처음엔 for룹 안에 pow를 사용했음
-다른 사이트들을 참고해 방법 바꿈.
#main함수
main에서는 makeSelfnum함수에 루프를 사용해 1부터 1000까지 인자로 넘긴다.
->루프안에서 반복 횟수가 많은 거 아닌가?
더 좋은 방법은 뭘까?
다른 사람들이 쓴 코드를 좀 살펴보니 그냥 했다.
<코드>
//#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int makeSelfNum(int num) {
int div = 1, result = 0;
while ( div <= num ) {
result += (num / div) % 10;
div *= 10;
}
return num + result;
}
int main(void)
{
int temp;
int arr[10100];// = (int*)calloc(10100, sizeof(int));
for (int i = 0; i <= 10000; i++) arr[i] = i;
for (int i = 1; i <= 10000; i++) {
if ((temp = makeSelfNum(i)) <= 10000) arr[temp] = 0;
}
for (int i = 1; i <= 10000; i++)
if (arr[i] != 0) printf("%d\n", arr[i]);
return 0;
}
'알고리즘 연습 > 백준' 카테고리의 다른 글
[2750][c]수 정렬 (0) | 2019.04.30 |
---|---|
[5622][java]다이얼 (0) | 2019.04.03 |
[1110]더하기 사이클 (0) | 2019.03.20 |
[4344]평균구하기 다시!! (0) | 2019.03.20 |
[1546]시험 점수 조작-malloc,calloc,realloc (0) | 2019.03.19 |