2016-05-01 2 views
0

Я хочу применить последовательность Collatz и применить ее ко всем числам от 1 до 10^6 и вернуть число с наибольшей цепочкой, необходимой для достижения 1. Однако, У меня проблема с тем, что мои циклы, похоже, не заканчиваются в Eclipse, и я не могу понять, почему, я даже не могу получить все мои отпечатки, показанные на консоли, несмотря на то, что это нужно на каждом шагу.Поиск самой длинной цепочки в последовательности Collatz в Java, цикл не заканчивается

Коллатца последовательность вычисляется по следующим правилам:

  • , если п нечетно, то следующее число равно п/2

  • , если п четно, то следующий номер 3n + 1

Это то, что я до сих пор:

public static long collatz() { 

    long res = 0; 
    long n = 1; 
    long count = 0; 
    long largestCount = 0; 
    long t = 0; 

    for (long k = 1; k <= 20; k++) { 

     n = k; 

     while (n != 1) { 

      if ((n % 2) == 0) { 
       n = n/2; 
       count = count + 1; 
      } 

      else { 
       n = (3 * n) + 1; 
       count = count + 1; 

      } 

      if (count > largestCount) { 
       largestCount = count; 
       res = k; 
      } 
     } 
    } 

    System.out.println(res); 
    return res; 

} 
+0

Вы ждали достаточно долго? Я изменил 'k <= 1000000' на' k <= 20', и эта программа вышла. – MikeCAT

+0

это должно выполняться нормально. тот факт, что вы печатаете кучу вещей, вызывает задержку. –

+0

Печать будет 264 868 848 строк + 1 (строка «результат:») в соответствии с [этим симулятором] (http://ideone.com/1XoAg4). Почему вы хотите так много строк? – MikeCAT

ответ

0

Ваш код должен работать должным образом. Однако он не работает. Вы проверяете, есть ли текущий count в настоящее время largest countвнутри цикл while, который на самом деле не имеет смысла, поскольку вам нужно получить длину последовательности collatz, а затем сравнить его с текущим максимум. Кроме этого, ваш код хорош. :)

Это то, что я написал, если вы заинтересованы.

final int number = 1000000; 

long sequenceLength = 0; 
long startingNumber = 0; 
long sequence; 

for (int i = 2; i <= number; i++) { 
    int length = 1; 
    sequence = i; 
    while (sequence != 1) { 
     if ((sequence % 2) == 0) { 
      sequence = sequence/2; 
     } else { 
      sequence = sequence * 3 + 1; 
     } 
     length++; 
    } 

    //Check if sequence is the best solution 
    if (length > sequenceLength) { 
     sequenceLength = length; 
     startingNumber = i; 
    } 
} 
System.out.println(startingNumber); 
+0

благодарим вас за ответ, но можете ли вы объяснить разницу в своем коде на мой? он выглядит мне одинаково, за исключением отпечатков, которые у меня были у меня. –

+0

@CatTran Конечно! Вы проверяли условие, чтобы увидеть, что текущий 'count' больше, чем текущий наибольший счет ** внутри ** цикла while, что на самом деле не имеет смысла, поскольку вам нужно получить длину последовательности collatz, а затем, проверьте его размер. В противном случае ваш код хорош. :) –

+0

@CatTran Было бы неплохо, если бы вы могли принять/отложить ответ, если ваша проблема решена или близка к разрешению. Из [здесь] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work): «Принимать ответ важно, поскольку он оба вознаграждает плакаты для решения вашей проблемы и информирует других что ваша проблема решена ». –

0

Он работает, но он всегда будет печатать последнее испытанное число, так как вы не сбросить count.

Я также перемещал приращение значения count из инструкции if/else, так как приращение не зависит от значения n.

И после обновления цикла я обновил largestCount.

public static long collatz() { 

    long res = 0; 
    long n = 1; 
    long count = 0; 
    long largestCount = 0; 
    long t = 0; 

    for (long k = 1; k <= 20; k++) { 

     n = k; 
     count = 0; // start every sequence with count = 0 

     while (n != 1) { 

      if ((n % 2) == 0) { 
       n = n/2; 
      } 
      else { 
       n = (3 * n) + 1; 
      } 
      count = count + 1; 
     } 
     if (count > largestCount) { 
      largestCount = count; 
      res = k; 
     } 
    } 

    System.out.println(res); 
    return res; 
} 
0

Если вы читали мое решение, вы можете увидеть, как писать комментарии для того, что куча строк кода должны сделать, это очень полезно и делает код самодокументированного ..

Try Online

public static long collatz(int maxN) 
{ 
    long res = 0, n = 1, count = 0, largestCount = 0, t = 0; 

    // for K in [1, max-N] 
    for (long k = 1; k <= maxN; k++) 
    { 
     // reset count to zero 
     n = k; count = 0; 

     // count how many steps to get to 1 
     while (n != 1) 
     { 
      // n = collatz(n) 
      n = (n%2==0 ? n/2 : (3*n)+1); 

      count++; // count the step 
     } 

     // check for maximum count 
     if (count > largestCount) 
     { 
      largestCount = count; 
      res = k; 
     } 
    } 

    return res; // return maximum solution 
} 
Смежные вопросы