2015-09-13 3 views
0

Запрос должен начинаться со случайного числа и постоянно менять это число в условиях, когда (1), если число четное, вы делите его на два и (2), если число нечетное , вы умножаете его на три, затем добавляете один.Использование цикла while

Так, например:

Если число было 13, то на выходе будет: 40 20 10 5 16 8 4 2 1

(Также программа должна прекратить после того, как значение 1 является достигнуто)

#include <iostream> 

using namespace std; 

int main() 
{ 
    int x; 
    int lengthcount=0; 

    cout << "Enter a number: "; 

    cin >> x; 

    while(x%2==0) 
    { 
     x=x/2; 
     cout << x << " "; 
     lengthcount++; 
    } 
    while(x%2==1) 
    { 
     x=x*3+1; 
     cout << x << " "; 
     lengthcount++; 
    } 
    if(x==1) 
    { 
     return 1; 
    } 

    cout << "Length:" << lengthcount << endl; 
} 

Это то, что у меня есть до сих пор. Но когда я компилирую и запускаю код, появляется только первое значение 40. Не остальные компоненты. Я предполагаю, что это связано с тем, что петли не соединяются друг с другом. Как получить его так, чтобы выход одного цикла переходил в другой цикл и обратно?

+3

Шаг 1: Прекратите предполагая вещи. Шаг 2. Запустите свой отладчик и узнайте, что происходит _actually_. –

+2

то, что вы написали: в то время как число четное, разделите на 2. Затем, пока число нечетное, умножьте на 3 и добавьте 1. И это конец! Итак, с 13 вы проходите мимо первого, повторяйте один раз через секунду, и все готово. Вам нужен глобальный цикл while, который выполняется до тех пор, пока x не равен 1. В этом цикле вы выполняете различные тесты и изменения в x. –

ответ

2

Два последовательных цикла не связаны, и вы не можете или не должны их делать.

Вместо этого необходимо иметь единый контур с if/else внутри него для обработки нечетных/четных случаев соответственно.

0

Способ, которым в настоящий момент является код, ни одно деление на 2^n, ни операция 3n + 1 не могут выполняться более одного раза. Вы должны иметь внешний цикл вокруг этих операций.

Правильный способ выхода из цикла с ключевым словом break, а не return.

int main() 
{ 
    int x; 
    int lengthcount=0; 

    cout << "Enter a number: "; 

    cin >> x; 

    while(true) { 
     while(x%2==0) 
     { 
      x=x/2; 
      cout << x << " "; 
      lengthcount++; 
     } 
     if(x==1) 
     { 
      break; 
     } 

     x=x*3+1; 
     cout << x << " "; 
     lengthcount++; 
    } 

    cout << "Length:" << lengthcount << endl; 
} 
0

Как я могу получить его так, что выход одного цикла будет перейти на другую петлю и обратно?

Вы можете ввести цикл в свой код.

Кроме того, поскольку 1%2==1 является истинным, x==1 всегда должен быть ложным после while(x%2==1).

Пример фиксированного кода:

#include <iostream> 

using namespace std; 

int main() 
{ 
    int x; 
    int lengthcount=0; 

    cout << "Enter a number: "; 

    cin >> x; 

    for(;;) 
    { 
     while(x%2==0) 
     { 
      x=x/2; 
      cout << x << " "; 
      lengthcount++; 
     } 
     if(x==1) // check if the value of 1 is reached 
     { 
      break; 
     } 
     while(x%2==1) 
     { 
      x=x*3+1; 
      cout << x << " "; 
      lengthcount++; 
     } 
    } 
    if(x!=1) // x should be 1 in here 
    { 
     return 1; 
    } 

    cout << "Length:" << lengthcount << endl; 
} 
Смежные вопросы