[code] 3n+1 (The 3n+1 Problem)

#include <stdio.h>
#include <stdlib.h>

typedef struct {
 unsigned int min;
 unsigned int max;
}VAULE;

unsigned int Get_Value(unsigned int value, unsigned int nCount);

int main(int argc, char* argv[])
{
 unsigned int index = 0;
 unsigned int max_count = 0;
 unsigned int tmp_count = 0;
 FILE* pInput_File = fopen("input.txt", "rt");
 FILE* pOutput_File = fopen("output.txt", "wt");

 VAULE value = {0};

 if( pInput_File == NULL || pOutput_File == NULL )
 {
  printf("File Open Error!\n");
  exit(1);
 }


 while( !feof(pInput_File) )
 {
  fscanf(pInput_File, "%d %d", &(value.min), &(value.max));

  for( index = value.min ; index <= value.max ; index++ )
  {

   tmp_count = Get_Value(index, 1);

   if( max_count < tmp_count )
   {
    max_count = tmp_count;
   }
  }// for
  printf("min: %d max: %d count: %d\n", value.min, value.max, max_count);
  fprintf(pOutput_File, "%d %d %d\n", value.min, value.max, max_count);

  max_count = tmp_count = 0;

 }// while

 fclose(pInput_File);
 fclose(pOutput_File);

 return 0;
}

unsigned int Get_Value(unsigned int value, unsigned int nCount)
{
 if( value == 1 )    // 정수 n 이 아래와 같은 알고리즘으로 했을 경우
 {                      //  결과적으로 1로 변한다는 것을 이용
  return nCount;
 }
 else
 {
  value = (value % 2 == 0) ? (value / 2) : (value * 3) + 1
  /*
  if( (value % 2) == 0 )
  {
   value /= 2;
  }
  else
  {
   value = (value * 3) + 1;
  }
  */

  nCount++;
  Get_Value(value, nCount);
 }
}

 

알고리즘의 간단한 문제...
입력된 두 수의 사이의 한 정수에 대해서 짝수일 경우 /2, 홀수일 경우 3을 곱한후 1을 더한다
이것의 결과로 Count가 많은 것을 찾아내는 것이다

예> 1 20 20 (정수1, 정수2, 최대 Count)

두수 사이의 최대 Count를 알아내는 것은 재귀함수를 이용해서 찾아내었다.

by 블랙호크 | 2007/03/19 12:31 | ┣ Algorithm | 트랙백 | 덧글(3)

트랙백 주소 : http://raptors.egloos.com/tb/89730
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by 오호라 at 2008/02/01 10:03
3n+1은 콜라츠의 문제라고 합니다. 이는 아직까지도 수학적으로 n 이 1이 된다는 것이 증명되지 않았습니다. ACM ICPC에서도 수의 제한을 두고 있습니다. 그렇기 때문에 재귀함수를 이용하면 스택오버플로우가 발생합니다.
Commented by Raptor at 2008/02/04 02:18
아 그렇군요...거기까지는 생각을 못했네요...^^
Commented by 오호라 at 2008/02/10 03:56
위키피디아를 통해서 잘 검색해보시면 콜라츠의 문제에 대한 재미있는 내용들이 있습니다. 수치를 도식화 내놓은것도 있고( 오르락내리락하다가 결국 2^N에서 직선이 되어버리죠. ^^; ) 좀더 어렵게 접근해서 설명한것도 있습니다. 이왕 비슷한 문제로는 해밍의 문제라는것도 있습니다. ^^ 해밍코드의 해밍입니다.

:         :

:

비공개 덧글

◀ 이전 페이지다음 페이지 ▶