수안보중학교 로고이미지

RSS 페이스북 공유하기 트위터 공유하기 카카오톡 공유하기 카카오스토리 공유하기 네이버밴드 공유하기 프린트하기
28. 우박수 구하기
작성자 수안보중학교 등록일 20.03.10 조회수 99



문제28
우박수 구하기

 
입력받은 자연수 n의 우박수와 우박수 사이클을 구하는 프로그램을 작성하시오. 우박수는 다음의 알고리즘을 통해 구할 수 있으며, 우박수 사이클은 알고리즘을 통해 출력되는 우박수의 개수를 의미한다. ‘우박수는 다음의 알고리즘을 통해 출력되는 값의 크기가 커졌다가 작아지는 현상이 반복되다가 종국에 가서는 1이 되어 종료된다는 의미에서 유래되었다.

알고리즘
자연수 n을 입력받는다.
n1이 될 때까지 다음을 반복한다.
n을 출력한다.
만약 n이 홀수면
n3n+1을 저장한다.
그렇지 않으면
nn/2를 저장한다.
n을 출력한다.

 
자연수 n22이면, 우박수는 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 이다. 이때 우박수 사이클은 16이다. 실행 파일의 이름은 문제 코드와 동일하다. 부분 점수는 없다.
 
입력 형식
입력 파일의 이름은 INPUT.TXT이다. 첫째 줄에 1,000,000 미만의 자연수 n이 주어진다.
출력 형식
출력 파일의 이름은 OUTPUT.TXT이다. 첫째 줄에 입력받은 자연수의 우박수 사이클을 력한다. 두 번째 줄에 공백을 사이에 두고 우박수를 출력한다. 우박수의 최대 사이클은 1000 미만이라고 가정한다.
 
 
 
입력과 출력의 예 1
입력 (INPUT.TXT)

22

출력 (OUTPUT.TXT)

16
22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

입력과 출력의 예 2
입력 (INPUT.TXT)

19

 
출력 (OUTPUT.TXT)

21
19 58 29 88 44 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

 
 
#include <stdio.h>
 
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
int a[1000];
int n;
int cycle=0;
int i;
 
scanf("%d",&n);
 
while(n!=1)
{
a[cycle]=n;
if ((n%2)==0) n/=2;
else n=3*n+1;
cycle++;
}
a[cycle]=n;
cycle++;
 
printf("%d\n",cycle);
for (i=0;i<cycle;i++)
printf("%d ",a[i]);
 
return 0;
}

 

이전글 29, 정렬하기(오름차순 정렬, sort)
다음글 27. 대문자, 소문자 갯수 구하기