3n+1 재귀함수

☆C언어/소스 2013. 6. 27. 17:54


//어떤 정수 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