2017-02-03 11 views
-2

現在、私はCollat​​z推測の問題をC言語で実装しています。私は特定の数字のシリーズを印刷することができます。たとえば、数字が25なら、シリーズは25 76 38 19 58 29 88 44 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 = 24のようなものです。 24は、一連の要素の数です。今私は1までシリーズの数を印刷したいと思います。 25,24,...1のようになります。C言語のCollat​​z推測プログラムの数値を減らす方法

#include <stdio.h> 

int main() { 
    long x, a = 0; 

    printf("Enter the value of X:"); 
    scanf("%lu", &x); 
    printf("%ld ", x); 

    for (i = x * x; i >= 1; i--) { 
     if (x % 2 == 0) { 
      x = x/2; 
      printf("%lu ", x); 
      if (x == 1) { 
       break; 
      } 
     } else { 
      x = (3 * x) + 1; 
      printf("%lu ", x); 
      if (x == 1) { 
       break; 
      } 
     } 
     a++; 
    } 
    printf(" = %lu\n", a + 2); 
    return 0; 
} 

をこの問題で私を助けてください:ここでは

は、私がしようとしているものです。

+1

デバッガツールボックスで非常に重要なツールです。デバッガを使用すると、変数とその値を監視しながら、コードを1行ずつ進めることができます。デバッガを使用できることは、パートタイムの愛好家としても、プログラムしたい人にとって必要不可欠なスキルです。 –

+0

また、[良い質問をする方法を読む](http://stackoverflow.com/help/how-to-ask)に時間を割いてください。あなたは、あなたがプログラムに与えたインプット、その実際のアウトプット、そしてあなたが期待したアウトプットを教えてください。 –

+0

ネストループが必要です(2ループ) – BLUEPIXY

答えて

1

xから1に反復するループを追加する必要があります。

値が1の場合、コードが正しく動作せず、正しい場所で出力数がカウントされず、驚くほど+ 2の最終調整につながることに注意してください。

コードを別の関数に移動すると、読みやすさが向上します。

あなたのガードループは意味がありません:x * x反復がx * xは非常に低くすることができるunsigned longの範囲、(Windows上x < 65536)内にあるとみなされた後停止します。値が大きくなると誤った結果になることがあります。ガードテストを削除するだけでコードが単純化され、Collatz conjectureが真であると仮定すると(すべての開始値が2 までテストされています)、無限ループを生成するカウンタの例は歓迎されます。ここで

は簡略化し、拡張版である:

#include <stdio.h> 

int main(void) { 
    unsigned long xx, x, a; 

    printf("Enter the value of X: "); 
    if (scanf("%lu", &xx) != 1) 
     return 1; 

    for (; xx >= 1; xx--) { 
     x = xx; 
     a = 0; 
     for (;;) { 
      printf("%lu ", x); 
      a++; 
      if (x == 1) 
       break; 
      if (x % 2 == 0) { 
       x = x/2; 
      } else { 
       x = (3 * x) + 1; 
      } 
     } 
     printf("= %lu\n", a); 
    } 
    return 0; 
} 
1

関数内の1つの要素に対してCollat​​z関数を使用することをお勧めします。この関数は、例えば次のような要素のパラメータをとる。次に、collat​​zシリーズを25で印刷します。

この関数を呼び出して、パラメータ24,23,22などで呼び出すことができます。これにより、すべての数値に対してcollat​​zシリーズが得られます。

あなた自身で試してみるべきであるので、私はコードを与えません。

関連する問題