3n + 1 вызов в UVa - PullRequest
       5

3n + 1 вызов в UVa

2 голосов
/ 07 февраля 2011

У меня проблемы с запуском "3n + 1 Problem" из "Programming Challenges" book .

Я испробовал каждое решение на Java, которое смог найти в Google (даже те, что находятся в стеке переполнения), и ни один из них не работает, все они сообщают «неправильный ответ».Я также нашел работающее решение C ++, перевел его на Java и тоже самое: «Неправильный ответ».

Я использую шаблон из Programming Challenges for Java submissions , и я мог быклянусь, мой алгоритм верен, единственная возможная проблема, о которой я могу думать, - это код для чтения ввода или записи вывода, но я не могу понять это.Вот мой код, любая помощь будет принята с благодарностью:

class myStuff implements Runnable {

    @Override
    public void run() {
        String line = Main.ReadLn(128);
        while (line != null) {
            process(line);
            line = Main.ReadLn(128);
        }
    }

    private void process(String line) {

        String[] data = line.split("\\s+");

        if (data.length == 2) {
            int low = Integer.parseInt(data[0]);
            int high = Integer.parseInt(data[1]);
            int max = low < high ? findMax(low, high) : findMax(high, low);
            System.out.println(low + " " + high + " " + max);
        }

    }

    private int findMax(int low, int high) {
        int max = Integer.MIN_VALUE;
        for (int i = low; i <= high; i++) {
            int length = cycleLength(i);
            if (length > max)
                max = length;
        }
        return max;
    }

    private int cycleLength(int i) {

        long n = i;
        int length = 1;

        while (n > 1) {
            n = ((n & 1) == 0) ? n >> 1 : 3*n + 1;
            length++;
        }

        return length;

    }

}

// java program model from www.programming-challenges.com
class Main implements Runnable {
    static String ReadLn(int maxLength) { // utility function to read from
        // stdin, Provided by Programming-challenges, edit for style only
        byte line[] = new byte[maxLength];
        int length = 0;
        int input = -1;
        try {
            while (length < maxLength) { // Read untill maxlength
                input = System.in.read();
                if ((input < 0) || (input == '\n'))
                    break; // or untill end of line ninput
                line[length++] += input;
            }

            if ((input < 0) && (length == 0))
                return null; // eof
            return new String(line, 0, length);
        } catch (java.io.IOException e) {
            return null;
        }
    }

    public static void main(String args[]) { // entry point from OS
        Main myWork = new Main(); // Construct the bootloader
        myWork.run(); // execute
    }

    @Override
    public void run() {
        new myStuff().run();
    }

}

Ответы [ 2 ]

6 голосов
/ 08 февраля 2011

решаемая. Хорошо, для начала, сайт http://programming -challenges.com определенно не работает сейчас для представлений Java (сейчас они выполняют какую-то миграцию сервера). Я пробовал альтернативный сайт http://uva.onlinejudge.org; тот обрабатывает представления Java правильно.

Но в любом случае у меня была ошибка в моем коде выше - эта строка исправляет это:

String[] data = line.trim().split("\\s+");

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

0 голосов
/ 31 января 2013

Главная страница> Онлайн-судья> Технические характеристики отправки

эта ссылка может помочь

Пример кода для чтения ввода: http://online -judge.uva.es / problemset / data/p100.java.html

вот еще одна ссылка для stackoverflow: https://stackoverflow.com/a/14632770/1060656

Я думаю, что самая важная вещь в оценке UVA: 1) Получить вывод Точно так же,Нет лишних строк в конце.2) Я предполагаю, Никогда не выбрасывать исключение, просто вернуть или прервать без вывода для параметров внешней границы.3) Вывод чувствителен к регистру 4) Выходные параметры должны сохранять пробел, как показано в задаче

...