2

「プログラミングの課題」の本の「3n+1問題」の実行に問題があります。

私はグーグルで見つけたJavaのすべてのソリューションを試しましたが(Stack Overflowのソリューションも)、1つも機能しませんでしたが、すべて「間違った答え」と報告されています。また、動作するC ++ソリューションを見つけ、それをJavaに翻訳しました。同じこと、「間違った答え」です。

私はJava送信用のプログラミングチャレンジのテンプレートを使用しています。アルゴリズムが正しいことを誓うことができます。考えられる唯一の問題は、入力の読み取りまたは出力の書き込みのコードにありますが、理解できません。アウト。これが私のコードです、どんな助けでも大歓迎です:

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();
    }

}
4

2 に答える 2

6

解決しました。まず最初に、 http://programming-challenges.comというサイトは、現在 Java の投稿に対して機能していません (現在、ある種のサーバー移行を行っています)。別のサイトhttp://uva.onlinejudge.orgを試しました。つまり、Java 送信を正しく処理しています。

とにかく、上記のコードにバグがありました - この行はそれを修正します:

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

入力データは常に乱雑です - 余分なスペース、空の行など。入力を解析しようとする人は誰でもこれを想定する必要があります。

于 2011-02-08T04:01:05.487 に答える
0

ホーム>オンライン審査員 > 提出仕様書

このリンクが役立つかもしれません

入力を読み取るサンプル コードは次のとおりです。 http://online-judge.uva.es/problemset/data/p100.java.html

ここにstackoverflowのもう1つのリンクがあります:https://stackoverflow.com/a/14632770/1060656

UVA ジャッジで最も重要なことは、1) 出力を取得することです。まったく同じで、最後に余分な行はありません。2)私は、外側の境界パラメータの出力なしで例外をスローしないか、単にリターンまたはブレークしないと仮定しています。3) 出力では大文字と小文字が区別されます 4) 出力パラメータは、問題に示すようにスペースを維持する必要があります

于 2013-01-31T18:40:54.273 に答える