2016-11-12 8 views
0

В настоящее время я работаю над проблемой гипотезы Collatz. Приложите образ проблемы.Поиск последовательности Collatz с наибольшим количеством терминов

Question (from ProjectEuler)

Теперь проблема, очевидно, говорится в диапазоне от 1 до 1000000. Но я добавил немного функциональности, позволяя пользователю выбирать, где должна начинаться начальная и конечная точка. Хотя я столкнулся с проблемой. (Как первый студент CS, не имеющий опыта программирования, мои знания сейчас очень ограничены).

Моя идея о том, как найти ту, которая имеет наивысшую последовательность, или самый высокий «loopCount», состоит в том, чтобы вытолкнуть число с соответствующим подсчетом цикла в массив и попытаться найти максимальное значение количества циклов в этом массиве. Но, насколько мне известно, это будет иметь 2-й массив.

Как я уже сказал, мои навыки программирования ограничены (мы еще не покрывали массивы), поэтому я не знаю, как начать это.

Вот что я до сих пор:

System.out.println("Enter starting point:"); 
    Scanner userStartingPoint = new Scanner(System.in); 
    long startingPoint = userStartingPoint.nextInt(); 

    System.out.println("Enter ending point:"); 
    Scanner userEndingPoint = new Scanner(System.in); 
    long endingPoint = userEndingPoint.nextInt(); 

    long timeBefore = System.currentTimeMillis(); 
    int loopCount; 

    for(long i = startingPoint; i <= endingPoint; i++) { 

     long number = i; 
     loopCount = 1; 

     while(number != 1) { 
      if(number%2 == 0) { 
       number = number/2; 
      } else if(number%2 != 0) { 
       number = (3*number)+1; 
      } 
      loopCount++; 
     } 

     System.out.println("Number: " + i + ". " + "Loop count: " + loopCount + "."); 
    } 

    long timeAfter = System.currentTimeMillis(); 
    long timeTaken = timeAfter - timeBefore; 
    System.out.println(endingPoint - startingPoint + " sequences."); 
    System.out.println("Time taken: " + timeTaken/1000 + " seconds."); 

Я использую «длинные» как тип данных для многих переменных здесь, потому что я обнаружил, что некоторые числа имеют итераций, которые идут выше суммы, которую Тип данных 'int' может обрабатываться.

ответ

0

Просто сохраните самый высокий loopCount в дополнительной переменной и обновите его после каждой итерации, если она увеличилась.

int maxCount = 0; 
int loopCount; 

for(long i = startingPoint; i <= endingPoint; i++) { 

    long number = i; 
    loopCount = 1; 

    while(number != 1) { 
     if(number%2 == 0) { 
      number = number/2; 
     } else if(number%2 != 0) { 
      number = (3*number)+1; 
     } 
     loopCount++; 
    } 
    if(loopCount > maxCount){ 
     maxCount = loopCount; 
    } 
    System.out.println("Number: " + i + ". " + "Loop count: " + loopCount + "."); 
} 
System.out.println("Highest loopCount : " + maxCount); 
+0

Как смущающе! Это, безусловно, гораздо более простой способ обойти это. спасибо – E13