2016-09-30 10 views
0

В моем коде есть логический недостаток, который, по-видимому, не может передать 2^31 - 1 в качестве входного сигнала. Вот фрагмент моего кода.Stuck in 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; 
} 

Я попытался изменить размер моего входа долго => долго долго, и она до сих пор застревают в этой области после ее отладки. Пожалуйста, предоставьте некоторую обратную связь. Спасибо!

+0

Эй, может быть, вы доказали, что гипотеза Collatz неверна? Naah .. –

+0

Как насчет печати 'temp' в цикле и посмотреть, что происходит? –

+1

В какой-то момент он может просто переполнить 'temp'. –

ответ

0

Если предположить, что система имеет длинный 64 бит, то изменение его работать с unsigned long, в том числе scanf(), кажется, работает хорошо:

#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-разрядный тип (длинный длинный?) для использования. Python работает, поскольку он имеет бесконечно большие целые числа.

+0

Спасибо, я попробую это – user2805478

0

A long int необязательно должен иметь более 32 бит. Чтобы убедиться, что вы используете 64-битные целые числа, лучше всего использовать тип int64_t от inttypes.h и использовать макрос PRId64 вместо ld при вызове scanf().

Тем не менее, на любой нормальной настольной системе вы должны получить как минимум 32-битный int здесь. Но, проблема в этой строке кода:

temp = 3 * temp + 1; 

Если вход 2^31-1, то это будет переполнение 32-битного Int.

+0

Спасибо! Это было очень полезно для меня. – user2805478

 Смежные вопросы

  • Нет связанных вопросов^_^