2014-12-24 50 views
-5

我想解決一個數學問題的樂趣。我聲明一個「數字」,如果它是偶數,則它被分成2,如果它是奇數,則它乘以3和+1。但是,我想要使用迭代,但出於某種原因,我的程序無法使用它。這裏有兩個代碼,一個聲明數字爲13,另一個使用迭代語句。迭代循環無限循環數學目的

#include <iostream> 

using namespace std; 

int main(){ 
    int sum = 0; 
    int number = 13; 
    cout << "\nFOR THIS NUMBER : " << number; 

    while (number > 1){ 
     if (number % 2 != 0){ 
       number = 3 * number + 1; 
       cout << "\n" << number; 
       sum = sum + 1; 
     } 
     if (number % 2 == 0){ 
       number = number/2; 
       cout << "\n" << number; 
       sum = sum + 1; 
     } 
    } 

    cout << "\n\nThe sum is : " << sum << "\n"; 
    return 0; 
} 

如預期那樣輸出40,20,10,5,16,8,4,2,1。

下面是其他代碼:

#include <iostream> 

using namespace std; 

int main(){ 
    int sum = 0; 
    for (int number = 13; number < 14; number = number + 1){  
     cout << "\nFOR THIS NUMBER : " << number; 

     while (number > 1){ 
      if (number % 2 != 0){ 
       number = 3 * number + 1; 
       cout << "\n" << number; 
       sum = sum + 1; 
      } 
      if (number % 2 == 0){ 
       number = number/2; 
       cout << "\n" << number; 
       sum = sum + 1; 
      } 
     } 
     cout << "\n\nThe sum is : " << sum << "\n"; 
    } 
    return 0; 
} 

這應該輸出完全一樣的答案,但是當我運行它,它變成一個無限循環。有人可以幫忙嗎?

+1

當'while'循環結束,'number'是'0'。for循環然後執行step語句,通過'1'遞增'number'。然後運行條件表達式,由於'1'明顯小於'14',所以循環再次運行。重複無限。 –

+4

這應該很容易找到,如果你可以使用調試器跨過你的代碼。 –

回答

0

當你的號碼變成2時,它陷入無限循環。如果是第二塊,第二塊就會變成第二塊。然後再通過「number = number + 1」變成2。然後通過再次變成1「的個數=號/ 2」,如果塊

所以,你需要打破..根據你的第一個代碼時數爲2

0

2,number爲「1」時,從while循環退出。

所以在「for」循環結束時,我們有number等於「1」且其不小於「14」,並且編譯器不會隨時退出for循環。

我覺得這個代碼正常工作:

for (int number = 13; number != 2; number = number + 1){  
    cout << "\nFOR THIS NUMBER : " << number; 

    while (number > 1){ 
     if (number % 2 != 0){ 
      number = 3 * number + 1; 
      cout << "\n" << number; 
      sum = sum + 1; 
     } 
     if (number % 2 == 0){ 
      number = number/2; 
      cout << "\n" << number; 
      sum = sum + 1; 
     } 
    } 
0

當數變得小於1,你離開內while循環。那麼在顯示器之後,你應該休息一下離開for循環。除非你會循環infinitly因爲數字將會少於14。

1

我認爲核心問題是,你使用number作爲循環控制變量,但你也修改number在循環內的方式與控制外環無關。這顯然是一種容易出錯的做法。

我建議你將循環控制與hailstone sequence分開計算。例如:

#include <iostream> 
using namespace std; 

int main(){ 
    int sum = 0; 
    for (int loop = 13; loop < 14; ++loop){ 
     int number = loop; 
     cout << "\nFOR THIS NUMBER : " << number; 

     while (number > 1){ 
      if (number % 2 != 0){ 
       number = 3 * number + 1; 
      } else { 
       number /= 2; 
      } 
      cout << "\n" << number; 
      ++sum; 
     } 
     cout << "\n\nThe sum is : " << sum << "\n"; 
    } 
    return 0; 
} 

現在for循環很容易推理,因爲loop不是在多個地方進行修改。

0

您需要兩個「數字」:for循環控制中的一個,它是當前「數字」以啓動一個向上/向下值序列,一個是當前「數字」的上/下序列中的一個開始的「數字」。

當你的for循環回到頂端number已被用來保存上/下序列中的每個值,但for循環邏輯期望它保持不變。

做出兩個變量。

for (int start = 13; start < 14; start = start + 1){  
    cout << "\nFOR THIS NUMBER : " << start; 
    number = start; 
    ... 
    } 

這給:

#include <iostream> 

using namespace std; 

int main(){ 
    int sum = 0; 

    for (int start = 13; start < 14; start = start + 1){  
     cout << "\nFOR THIS NUMBER : " << start; 
     number = start; 

     while (number > 1){ 
      if (number % 2 != 0){ 
       number = 3 * number + 1; 
       cout << "\n" << number; 
       sum = sum + 1; 
      } 
      if (number % 2 == 0){ 
       number = number/2; 
       cout << "\n" << number; 
       sum = sum + 1; 
      } 
     } 
     cout << "\n\nThe sum is : " << sum << "\n"; 
    } 
    return 0; 
}