2016-09-30 42 views
0

我的代碼中有一個邏輯缺陷,我似乎無法通過2^31 - 1作爲輸入。這是我的代碼片段。卡住在循環Collat​​z猜想在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,並且在調試它之後它仍然卡在這個區域內。請提供一些反饋謝謝!

+0

嘿,難道你證明Collat​​z猜想是錯誤的嗎? 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; 
} 

用法

> ./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?)使用。 Python可以工作,因爲它有無限大的整數。

+0

謝謝我會試試這個 – user2805478

0

A long int不一定要多於32位。爲確保您使用的是64位整數,最好使用inttypes.h中的int64_t類型,並在調用scanf()時使用PRId64宏而不是ld

儘管如此,在任何普通的桌面系統上,您應該至少得到一個32位int。但是,問題出現在這行代碼中:

temp = 3 * temp + 1; 

如果輸入是2^31-1,那麼這將溢出一個32位int。

+0

謝謝!這對我非常有幫助。 – user2805478