2014-12-24 3 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 выполняет оператор шага, увеличивая число на '1'. Затем он запускает выражение условия, и поскольку '1', очевидно, меньше, чем' 14', цикл запускается снова. Повторите для бесконечности. –

+4

Это должно было быть легко найдено, если бы вы перешли через свой код с помощью отладчика. –

ответ

0

Когда ваш номер становится 2, он попадает в бесконечный цикл. число 2 становится 1 во втором, если блок. то он снова становится 2 «числом = число + 1». затем становится 1 снова «число = число/2» в 2, если блок

Таким образом, все, что вам нужно сломать .. когда число 2

0

в соответствии с вашим первым кодом, number является «1», когда его выход из цикла while.

поэтому в конце цикла «для» у нас есть number равно «1» и его не меньше «14», и компилятор не будет выходить из цикла в любое время.

Я думаю, что этот код работает правильно:

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 вы оставить внутренний во время цикла. то после отображения вы должны сделать перерыв, чтобы выйти из цикла for. если только вы не закончите бесконечно, так как число будет меньше, чем 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 возвращается к началу number был использован для хранения каждого из значений в последовательности вверх/вниз, но логика цикла цикла ожидает, что она не изменится.

Сделайте две переменные.

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; 
} 
Смежные вопросы