2014-12-24 48 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; 
}