2016-09-30 9 views
0

입력 내용으로 2^31-1을 전달할 수없는 논리 결함이 내 코드에 있습니다. 여기 내 코드 조각입니다.Loop Collatz에 집착 C에서 추측 시도

#include <stdio.h> 
int main() { 
long input = 0; 
long temp = 0; 
int count = 0; 
printf("Enter a positive integer (or 0 to quit): "); 
scanf("%ld", &input); 
if(input == 0) 
{ 
    printf("Quit."); 
} 
else 
{ 
    temp = input; 
    while (temp != 1) 
    { 
     if(temp %2 ==0) 
     { 
      temp = temp/2; 
      count++; 


     } else 
     { 
      temp = 3*temp + 1; 
      count++; 
     } 

    } 
return 0; 
} 

내 입력 크기를 long => long long으로 변경하려고 시도했지만 디버깅 후이 영역 내에서 여전히 고착됩니다. 의견을 보내주세요. 감사합니다!

+0

안녕하세요, Collatz의 추측이 틀렸다는 것을 입증하셨습니까? Naah .. –

+0

루프에 'temp'를 출력하고 무슨 일이 일어나는지 보시겠습니까? –

+1

어떤 시점에서 'temp'가 오버 플로우 될 수 있습니다. –

답변

0

다음은 scanf() 포함 unsigned long 작업을 변경, 64 비트의 길이를 시스템을 한 가정이, 잘 작동하는 것 같다 :

#include <stdio.h> 
#include <assert.h> 

int main() { 
    unsigned long input; 
    assert(sizeof(input) * 8 >= 64); 

    while (1) { 
     printf("Enter a positive integer (or 0 to quit): "); 
     (void) scanf("%lu", &input); 

     if (input == 0) { 
      break; 
     } 

     unsigned int count = 0; 

     while (input != 1) { 
      if (input % 2 == 0) { 
       input /= 2; 
      } else { 
       input = 3 * input + 1; 
      } 
      count++; 
     } 

     printf("%d\n", count); 
    } 

    printf("Quit.\n"); 

    return 0; 
} 

USAGE에게

> ./a.out 
Enter a positive integer (or 0 to quit): 2147483647 
450 
Enter a positive integer (or 0 to quit): 0 
Quit. 
> 

를 그렇지 않으면 발견 다른 64 비트 유형 (long long?)을 사용하십시오. 파이썬은 무한히 큰 정수를 가지고 있기 때문에 작동합니다.

+0

감사합니다. 이것을 시도 할 것입니다 – user2805478

0

long int은 반드시 32 비트 이상일 필요는 없습니다. 64 비트 정수를 사용하려면 scanf()을 호출 할 때 ld 대신 PRId64 매크로를 사용하고 inttypes.hint64_t 유형을 사용하는 것이 가장 좋습니다.

여전히 일반적인 데스크탑 시스템에서는 최소한 32 비트 정수를 가져와야합니다. 그러나, 문제는 코드의 라인이다 입력 2^31-1는,이 32 비트 오버플 INT 것이다

temp = 3 * temp + 1; 

경우.

+0

감사합니다! 이것은 나를 위해 매우 도움이되었습니다. – user2805478