2017-02-03 60 views
-2

目前我正在用C語言實現Collat​​z猜想問題。我可以打印一系列特定的數字。例如,如果號碼是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 = 2424是該系列中的元素的數量。現在我想打印系列號碼,直到1。如25,24,...1如何減少Collat​​z猜想程序中的數字C

這是我曾嘗試:

#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

調試器是工具箱中的一個非常重要的工具。使用調試器,您可以逐行執行代碼,同時監控變量及其值。能夠使用調試器是任何想要編程的人都需要的關鍵技能,甚至是作爲兼職愛好者。 –

+0

也請花些時間[閱讀如何提出好問題](http://stackoverflow.com/help/how-to-ask)。你需要告訴我們你給這個程序什麼輸入,它的實際輸出是什麼,以及你期望的輸出。 –

+0

你需要嵌套循環(2個循環) – BLUEPIXY

回答

1

您應該添加一個額外的循環,從x一直循環到1

請注意,您的代碼無法正確運行1的值,並且不計算正確點的輸出數量,導致令人驚訝的最終調整+ 2

將代碼移到單獨的函數將提高可讀性。

您的保護環路沒有意義:在x * x迭代之後停止假設x * xunsigned 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函數。這個函數將取一個元素的參數,例如25然後打印collat​​z系列25.

然後,您可以圍繞該函數運行一個循環,用參數24,23,22等調用它。這將爲所有這些數字提供collat​​z系列。

我沒有給出代碼,因爲你應該自己嘗試一下。