검색결과 리스트
글
3n+1 재귀함수
//어떤 정수 n에서 시작해, n이 짝수면 2로 나누고, 홀수면 3을 곱한 다음 1을 더한다.
//이렇게 해서 새로 만들어진 숫자를 n으로 놓고, n=1 이 될때까지 같은 작업을 계속 반복한다.
//예를 들어, n=22이면 다음과 같은 수열이 만들어진다.
//
//22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
//
//n이라는 값이 입력되었을때 1이 나올때까지 만들어진 수의 개수(1을 포함)를 n의 사이클 길이라고 한다.
//위에 있는 수열을 예로 들면 22의 사이클 길이는 16이다. i와 j라는 두개의 수가 주어졌을때,
//i와 j사이의 모든 수(i, j포함)에 대해 최대 사이클 길이를 구하라.
#include<stdio.h>
int func(int num,int cycle)
{
// printf("함수 ( %d ) ", num);
if(num==1)
return cycle;
if(num%2)
{
//홀수
return func(num*3+1,++cycle);
}
else
{
//짝수
return func(num/2,++cycle);
}
return 0;
}
int main()
{
// FILE *in=fopen("input.txt","r");
// FILE *out=fopen("output.txt","w");
int i=0,j=0,
su1=0,su2=0; //숫자 범위
int count=0; //숫자 개수 함수 호출수
int arr[1000][2]={0,}; //배열
int min=0,max=0; //계산한 사이클, 최대 사이클
// while(EOF!=fscanf(in,"%d %d",&su1,&su2))
while(EOF!=scanf("%d%d",&su1,&su2))
{
// printf("%d %d " ,su1,su2);
arr[count][0]=su1;
arr[count++][1]=su2;
// printf("\n카운트 : %d\n ",count);
for(i=0;i<count;++i)
{
// func(arr[i][0],arr[i][1]);
max=0; //초기화
if(arr[i][0]>arr[i][1])
{
su1=arr[i][1];
su2=arr[i][0];
}
else
{
su1=arr[i][0];
su2=arr[i][1];
}
for(j=su1;j<=su2;++j)
{
min=func(j,1);
if(max<min)
max=min;
}
//출력
printf("%d %d %d \n",arr[i][0],arr[i][1],max);
}
}
// fclose(in);
// fclose(out);
return 0;
}
'☆C언어 > 소스' 카테고리의 다른 글
달력 문제 (0) | 2017.06.14 |
---|---|
3n+1 (0) | 2013.06.27 |
최소의 동전수 (재귀) (0) | 2013.06.23 |
c언어 숫자 변수에 문자입력시 출력 (0) | 2012.10.10 |
사다리 (0) | 2012.09.12 |