2016-06-25 4 views
0

n=2 a^n + b^n = c^nを除いて、次の式が成立しないという理論があるかどうかを確認するコードを書いた。 プログラムは最後に "Meh、Fermatが正しい"と言ってプログラムの終わりをマークしますが、その後は多くの例外行がスローされます。フェルマーの理論の1つをチェックしようとしているコードが例外を投げている

これはコードです -

public class CheckFermats { 

    public static void main(String[] args) { 
     int a=2; 
     int b=2; 
     int c=2; 
     int n=3; 
     int round = 2; 
     CheckupA (a,b,c,n,round); 

    } 

    public static void CheckupA (int a, int b, int c, int n ,int round){ 
     if (Math.pow(a,n)+Math.pow(b,n)==Math.pow(c, n)) 
     { 
      System.out.println("HOLYSHIT FERMET WAS WRONG!!"); 
     } 
     else 
     { 
      if (a==9) 
      { 
       a=round+1; 
       CheckupB (a,b,c,n, round); 

      } 
      else 
      { 
      a++; 
      CheckupA (a,b,c,n, round); 
      } 
     } 
    } 

    public static void CheckupB (int a, int b, int c, int n,int round){ 
     if (Math.pow(a,n)+Math.pow(b,n)==Math.pow(c, n)) 
     { 
      System.out.println("HOLYSHIT FERMET WAS WRONG!!"); 
     } 
     else 
     { 
      if (b==9) 
      { 
       b=round+1; 
       CheckupC (a,b,c,n, round); 

      } 
      else 
      { 
      b++; 
      CheckupB (a,b,c,n, round); 
      } 
     } 
    } 

    public static void CheckupC (int a, int b, int c, int n,int round){ 
     if (Math.pow(a,n)+Math.pow(b,n)==Math.pow(c, n)) 
     { 
      System.out.println("HOLYSHIT FERMET WAS WRONG!!"); 
     } 
     else 
     { 
      if (c==9) 
      { 
       c=round+1; 
       round++; 
       CheckIfFinished (n); 
       checkIfIncreaseN (a,b,c,round, n); 
       CheckupA (a,b,c,n, round); 

      } 
      else 
      { 
      c++; 
      CheckupC (a,b,c,n, round); 
      } 
     } 
    } 

    public static void checkIfIncreaseN(int a, int b, int c, int round, int n){ 
     if(round==9) 
     { 
      round = 2; 
      a=2; 
      b=2; 
      c=2; 
      n++; 
      CheckupA (a,b,c,n,round); 

     } 
    } 

    public static void CheckIfFinished (int n){ 
     if (n==9) 
     { 
      System.out.println("Meh, Fermet was right"); 
      return; 
     } 
    } 
} 
+0

私に推測させてください: 'StackOverflowError'。 –

+0

複数の質問がある場合は別々に質問してください。また、スタックトレースと、取得している例外に関する詳細情報を追加してください。 – abarisone

答えて

0

あなたのコードは、あなたがMeh, Fermet was rightことを確認している場合でも、続きます。終了してもコードCheckIfFinished (n);を参照してください。

したがって、チェックが満たされたかどうかをチェックする変数をメソッドに追加したり、メソッドの戻り値を使用したりすることができます。

など。追加パラメータ:

public static void CheckupC (int a, int b, int c, int n,int round, boolean finished) 
{ 
    if (finished) {return;} 
    ... 
} 

または、このメソッドの戻り値を使用すると、終了したことを示します。

if (CheckupC(...)) { return true; } 

あなたが全体のコードのためにこれを使用する場合、それは(多分それは最高のスタイルではなく、それはあなたの問題を解決して)次のようになります。また

public static void main(String[] args) { 
    int a=2; 
    int b=2; 
    int c=2; 
    int n=3; 
    int round = 2; 
    CheckupA (a,b,c,n,round); 

} 
public static boolean CheckupA (int a, int b, int c, int n ,int round) 
{ 
    if (Math.pow(a,n)+Math.pow(b,n)==Math.pow(c, n)) 
    { 
     System.out.println("HOLYSHIT FERMET WAS WRONG!!"); 
     return true; 
    } 
    else 
    { 
     if (a==9) 
     { 
      a=round+1; 
      return CheckupB (a,b,c,n, round); 

     } 
     else 
     { 
      a++; 
      return CheckupA (a,b,c,n, round); 
     } 
    } 
} 
public static boolean CheckupB (int a, int b, int c, int n,int round) 
{ 
    if (Math.pow(a,n)+Math.pow(b,n)==Math.pow(c, n)) 
    { 
     System.out.println("HOLYSHIT FERMET WAS WRONG!!"); 
     return true; 
    } 
    else 
    { 
     if (b==9) 
     { 
      b=round+1; 
      return CheckupC (a,b,c,n, round); 

     } 
     else 
     { 
      b++; 
      return CheckupB (a,b,c,n, round); 
     } 
    } 
} 
public static boolean CheckupC (int a, int b, int c, int n,int round) 
{ 
    if (Math.pow(a,n)+Math.pow(b,n)==Math.pow(c, n)) 
    { 
     System.out.println("HOLYSHIT FERMET WAS WRONG!!"); 
     return true; 
    } 
    else 
    { 
     if (c==9) 
     { 
      c=round+1; 
      round++; 
      if (CheckIfFinished (n)) { 
       return true; 
      } 
      if (checkIfIncreaseN (a,b,c,round, n)) { 
       return true; 
      } 
      return CheckupA (a,b,c,n, round); 

     } 
     else 
     { 
      c++; 
      return CheckupC (a,b,c,n, round); 
     } 
    } 
} 
public static boolean checkIfIncreaseN(int a, int b, int c, int round, int n) 
{ 
    if(round==9) 
    { 
     round = 2; 
     a=2; 
     b=2; 
     c=2; 
     n++; 
     return CheckupA (a,b,c,n,round); 
    } 

    return false; 
} 
public static boolean CheckIfFinished (int n) 
{ 
    if (n==9) 
    { 
     System.out.println("Meh, Fermet was right"); 
     return true; 
    } 

    return false; 
} 

あなたが計算を行ういくつかのより多くのアドバイスdoubleの場合は、double値を==と比較せず、Double.compareを使用してください。

+0

'Double.compare'は失われた精度を解決するのに役立ちません。ディオファントス方程式を扱うとき、唯一の正しい方法は整数演算に固執することです。 –

+0

@MarkoTopolnikしかし、私のアドバイスは一般的に 'double'計算のためだった –

+1

うん、アドバイスはオフトピックです(本当に間違っていない場合)。 –

関連する問題