2015-06-17 4 views
1

Это проблема для онлайн-судьи. Требуется два входа: i и j, где между двумя входами должна быть найдена наибольшая длина цикла 3n + 1.Пока цикл не завершается, когда условие выполнено (C++)

Программа должна заканчиваться, когда x становится равным 1. Но когда она равна 1, код не заканчивается, а продолжает цикл 1. Заранее благодарим за любую помощь.

#include <iostream> 

using namespace std; 

int main(){ 
    int i, j, temp_i, temp_j, counter, max; 

    max = 0; 

    cin >> i >> j; 

    temp_i = i; 
    temp_j = j; 

    for(int x = i; x < j; x++){ 
     counter = 1; 
     while(x != 1){ 
      if(x % 2 == 0){ 
       x = x/2; 
       // cout << x << endl; 
      } 
      else{ 
       x = 3*x + 1; 
      } 
      counter++; 
     } 
     if(counter > max){ 
      max = counter; 
     } 
    } 

    cout << temp_i << " " << temp_j << " " << max << endl; 

    return 0; 
} 
+0

Вы уверены, что 'x' станет 1 в любое время? Похоже, он может расходиться до бесконечности. –

ответ

1

У вас есть логическая ошибка в отношении ваших петель. Подумайте об этом: когда x == 1 и внутренний контур заканчиваются, то x увеличивается до 2, а внутренний цикл запускается до x == 1, когда x увеличивается до 2, и внутренний цикл снова запускается ... И так далее и так далее.

Вам нужно использовать вторую переменную для подсчета внешнего контура. Что-то вроде

for (int y = i; y < j; ++y) 
{ 
    int x = y; 
    while (x != 1) 
    { 
     ... 
    } 
}