2011-07-20 7 views
0

この問題を解決するコードを書きました。SPOJの問題AE2BのNZEC

には単純な算術計算(ゼロで割ってはならない)が含まれているため、NZEC(ランタイムエラー)は引き続き発生しますが、コードのどの部分が例外を引き起こすかはわかりません。

コードのロジックは重要ではありません。私は例外がどこに隠れているのだろうかと思います。

いずれのバグも見つかることがありますか?おかげさまで あなたのGCD()メソッドを使用して

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 

/** 
* SPOJ Problem Set (classical) 4302. (K,N)-Knight Problem code: AE2B 
* 
* @author Eric 
* 
*/ 
public class AE2B { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) throws IOException { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(
       System.in)); 
     int count = Integer.parseInt(reader.readLine()); 
     for (int i = 0; i < count; ++i) { 
      String[] tokens = reader.readLine().split(" "); 
      int k = Integer.parseInt(tokens[0]); 
      int n = Integer.parseInt(tokens[1]); 
      int x1 = Integer.parseInt(tokens[2]); 
      int y1 = Integer.parseInt(tokens[3]); 
      int x2 = Integer.parseInt(tokens[4]); 
      int y2 = Integer.parseInt(tokens[5]); 

      int g = gcd(k, n); 
      int dx = Math.abs(x1 - x2); 
      int dy = Math.abs(y1 - y2); 
      if (g > 1) { 
       if ((dx % g != 0) || (dy % g != 0)) { 
        System.out.println("NIE"); 
        continue; 
       } 
       k /= g; 
       n /= g; 
       dx /= g; 
       dy /= g; 
      } 
      if (k % 2 == 0 || n % 2 == 0) { 
       System.out.println("TAK"); 
      } else if (dx % 2 + dy % 2 == 1) { 
       System.out.println("NIE"); 
      } else { 
       System.out.println("TAK"); 
      } 
     } 

    } 

    static int gcd(int a, int b) { 
     if (a < b) { 
      return gcd(b, a); 
     } 
     if (b == 0) { 
      return a; 
     } 
     return gcd(b, a % b); 
    } 

} 
+0

あなたは何をすべきか「NZEC」の意味ですか?あなたが例外を持っているなら、*どこに例外がありますか?スタックトレースは、問題を示すサンプルユーザー入力と同様に便利です。 –

+0

入力を見て、どこでも整数オーバーフローが発生していないことを確認してください。負の数は、正の数を前提としたコードでは奇妙なことをする可能性があります。 – rossum

+0

@Jon Skeet、SPOJのNZECは、 "非ゼロ終了コード"を意味します。これは、プログラムが実行中に例外を検出したときに発生します。 SPOJのようなオンラインジャッジは、あなたのプログラムが例外を満たしていると伝えますが、スタックトレースまたは例外名は表示されません。あなたは自分でそれを理解することしかできません。 –

答えて

0

、私は、スタックオーバーフローエラーを取得:

gcd(-12, -17); 

私はあなたが負の数のGCDを計算することを避けることを示唆している:

static int gcd(int a, int b) { 
    a = Math.abs(a); 
    b = Math.abs(b); 
    if (a < b) { 
     return gcd(b, a); 
    } 
    if (b == 0) { 
     return a; 
    } 
    return gcd(b, a % b); 
} 
+0

問題の説明に「0≤K、N≤10^9」と表示されるので、kとnは負ではありません。あなたが言ったことが理由であってはならない。 –

+0

問題は、「0≦K、N≦10^9、K + N> 0」と表示されます。私がそれを読むと、Nは負であるかもしれません、合計K + Nだけが正に保証されます。両方が正に保証されていれば、「K + N> 0」部分は余計になります。 – rossum

+0

これは間違っています。 K + N> 0はKを意味し、Nは同時に0になることはできません。 KとNの両方にabs()を適用するとNZECが得られるので、説明はKとNの両方が所定の間隔内にあることを意味します。 –