2011-02-07 9 views
2

「プログラミング課題」から「3n + 1問題」を実行するのに問題があります。UVaで3n + 1チャレンジ

Googleで見つけられるJavaのすべてのソリューションを試しましたが(Stack Overflowのものでさえも)、1つではなく、すべて「誤った回答」と報告されています。私はC++の実用的なソリューションを見つけて、それをJavaに変換しました。同じこと:「間違った答え」。

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

} 
+0

サンプルデータに対して自分でプログラムを実行できますか?正しい答えが出ますか? – btilly

+0

はい、正しくフォーマットされた入力で正常に動作します。それは問題でした、私は入力が適切にフォーマットされていると仮定してはいけませんでした。防御的なスタイルのプログラム –

答えて

6

解決済み。まず、サイトhttp://programming-challenges.comは、Javaの提出のために今は正しく動作していません(今、何らかのサーバー移行を行っています)。私は代替サイトhttp://uva.onlinejudge.orgを試しました。その1つはJavaの送信を正しく処理しています。

しかし、いずれにせよ、私は上記の私のコードにバグがありました - この行は、それが修正されています。

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

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

+0

は、( "\\ s +")すべての空白を取り除くべきではありませんか? ?...私はこれをテストしました。彼らは一緒に使われるべきですが、理由を理解できません。 –

+0

@ Max.Mirkia分割前に 'trim()'を呼び出さずに行が始まったり空白で終わったりしたら、 'data'配列に余分な空文字列が入ることがあります。最後に)。テストをして、自分で見てください。 –

0

ホーム>オンラインジャッジ>提出仕様

このリンクは入力を読み込むため

サンプルコードを助けるかもしれないですから。私はhttps://stackoverflow.com/a/14632770/1060656

http://online-judge.uva.es/problemset/data/p100.java.html

ここstackoverflowのための1つの以上のリンクありUVA裁判官の中で最も重要なことは1)だと思います。結果はまったく同じです。最後に余分な行はありません。 2)私は仮定している、例外をスローしないでください。 3)出力は大文字と小文字が区別されます4)出力パラメータは空白を問題なく表示する