Проблема последовательности Коллатца - PullRequest
4 голосов
/ 05 апреля 2010

Я пытаюсь решить эту проблему, это не домашнее задание, а просто код, который я отправляю на uva.onlinejudge.org, чтобы я мог лучше изучить примеры с использованием Java. Вот пример ввода проблемы:

 3 100
 34 100
 75 250
 27 2147483647
 101 304
 101 303
 -1 -1

Вот простой вывод:

 Case 1: A = 3, limit = 100, number of terms = 8
 Case 2: A = 34, limit = 100, number of terms = 14
 Case 3: A = 75, limit = 250, number of terms = 3
 Case 4: A = 27, limit = 2147483647, number of terms = 112
 Case 5: A = 101, limit = 304, number of terms = 26
 Case 6: A = 101, limit = 303, number of terms = 1

Дело в том, что это должно быть выполнено в течение 3 секунд, иначе ваш вопрос не будет принят в качестве решения, вот то, что я до сих пор придумал, он работает так, как должно, просто время выполнения не в пределах 3 секунд, вот код:

import java.util.Scanner;

class Main {
  public static void main(String[] args) {
    Scanner stdin = new Scanner(System.in);
    int start;
    int limit;
    int terms;
    int a = 0;

    while (stdin.hasNext()) {
      start = stdin.nextInt();
      limit = stdin.nextInt();
      if (start > 0) {
        terms = getLength(start, limit);
        a++;
      } else {
        break;
      }
      System.out.println("Case "+a+": A = "+start+", limit = "+limit+", number of terms = "+terms);
    }
  }

  public static int getLength(int x, int y) {
    int length = 1;
    while (x != 1) {
      if (x <= y) {
        if ( x % 2 == 0) {
          x = x / 2;
          length++;
        }else{
          x = x * 3 + 1;
          length++;
        }
      } else {
        length--;
        break;
      }
    }

    return length;
  }
}

И да, вот как это должно быть решено:

Алгоритм, заданный Лотаром Коллатцем, создает последовательности целых чисел и описывается следующим образом:

Step 1:
    Choose an arbitrary positive integer A as the first item in the sequence. 
Step 2:
    If A = 1 then stop. 
Step 3:
    If A is even, then replace A by A / 2 and go to step 2. 
Step 4:
    If A is odd, then replace A by 3 * A + 1 and go to step 2. 

И да, мой вопрос как я могу заставить его работать за 3 секунды?

1 Ответ

5 голосов
/ 05 апреля 2010

Из Googling я нашел этот поток , где у пары других людей была такая же проблема, и решение состоит в том, чтобы использовать 64-битную арифметику вместо 32-битной арифметики.

Попробуйте изменить int на long и посмотрите, поможет ли это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...