2016-09-30 3 views
0

私のコードには2^31 - 1を入力として渡すことができないという論理的欠陥があります。ここに私のコードの断片があります。Loop 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 longに変更しようとしましたが、デバッグ後にこの領域内にまだ詰まっています。フィードバックをお願いします。ありがとうございます!

+0

ちょっと、Collat​​zの推測が間違っていることが証明されている可能性がありますか? 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?)を使用します。 Pythonは無限大の整数を持つので動作します。

+0

ありがとう、私はこれを試してみます – user2805478

0

long intは必ずしも32ビット以上である必要はありません。 64ビット整数を確実に使用するには、scanf()の呼び出しでldの代わりにPRId64マクロを使用すると、int64_tタイプをinttypes.hから使用することをお勧めします。

まだ、通常のデスクトップシステムでは、ここに少なくとも32ビットのintを取得する必要があります。しかし、問題は次のコード行にあります。

temp = 3 * temp + 1; 

入力が2^31-1の場合、これは32ビットの整数をオーバーフローします。

+0

ありがとう!これは私にとって非常に役立ちました。 – user2805478

関連する問題