2016-09-24 15 views
1
私は100 -100からすべての値を検索したい

a、b、cは見つけるために、すべての組み合わせを通過する方法を説明したときにa√2 - =c√3B。私はa、b、cが0のときは真であることを知っていますが、私はちょうどそのプログラムを作りたがっています。到達不能コード+

私は、Bおよび-100〜100私はちょうどで、b、cの増加を作っ作成したプログラムにCのすべての組み合わせを検索する私のプログラムを取得するために何をするか分かりません1つの繰り返しごとに1、私はすべての組み合わせを得ることができませんでした。私は "continue;"を使用して組み合わせの量を増やそうとしましたが、 "到達不能なコード"エラーが発生しました。これは私にすべての可能な組み合わせを与えることはありません。

私はまた、彼らは倍増することによって、ループのすべての繰り返しの後に0.001で、a、b及びcを増加させようとしました。これは0.000 ...で停止していたはずですが、代わりに永遠に続きました。これは、a、b、cの最後に9.4524 x 10^-8(繰り返しごとに異なる)のようなランダムな小さな数字が追加されたためです。

これは私のコードです:

public static void main(String[] args) { 
    int a = -100; 
    int b = -100; 
    int c = -100; 

    while ((a*Math.sqrt(2)) - b != (c*Math.sqrt(3))) { 
     if (a == 100){ 
      return; 
     } else{ 
      a++; 
      System.out.println("a = " + a); 
      continue; 
     } 

     if (b == 100){ 
      return; 
     } else{ 
      b++; 
      System.out.println("b = " + b); 
      continue; 
     } 

     if (c == 100){ 
      return; 
     } else { 
      c++; 
      System.out.println("c = " + c); 
      continue; 
     } 
    } 
} 

は、私は上記の問題を解決するために何ができますか?どんな助けでも大歓迎です。

ありがとうございました。

+0

a、bおよびcは整数または倍数と見なされますか? – BadChanneler

+0

b =a√2 - c√3を再配置して、bの小数部をテストして、ダブルループのみを使用することができます。 – LutzL

+0

ルート2とルート3が非合理的であるため、私は(0、0、0)以外の他の全番号ソリューションがあると信じるように奮闘します。 –

答えて

1

あなたの問題は、あなたがab、およびcの組み合わせによってインクリメントしている方法です。各abのそれぞれについて、それぞれcがa√2-b =c√3であるかどうかをチェックしたいとします。また、コードをスピードアップするために、√2と√3の値を各繰り返しで再計算される定数としてキャッシュすることができます。また、あなたの質問で言及したように、浮動小数点演算で丸め誤差に遭遇することがあります。したがって、Doubleクラスのstatic compareメソッドを使用することをお勧めします。そのことについてはhereを読むことができます。

このコードでは、式a√2-b =c√3を満たすa,b、およびcのすべての整数の組み合わせが出力されます。 1つの解決策を探しているだけの場合、ネストされたforループを取り出して独自のメソッドに入れ、if条件が満たされたらその解決策を返します。また、if条件を満たす各ソリューションをArrayListに追加して、ループの完了後に戻ることで、ソリューションのリストを返すこともできます。

public class SurdsMain { 
    public static void main(String[] args) { 
     final double SQRT2 = Math.sqrt(2); 
     final double SQRT3 = Math.sqrt(3); 

     for(int a = -100; a <= 100; a++) { 
      for(int b = -100; b <= 100; b++) { 
       for(int c = -100; c <= 100; c++) { 
        if(Double.compare(a * SQRT2 - b, c * SQRT3) == 0) { 
         System.out.println("a = " + a + "; b = " + b + "; c = " + c); 
        } 
       } 
      } 
     } 
    } 
} 
+0

a、b、cのすべての組み合わせをコンソールに表示するコードをどのように取得するのですか?また、これは、私のように(「続行」なしで)同時に、a、b、cに1を加算しないでしょうか?それはループの仕組みではありませんか?申し訳ありませんが、私はかなりJavaに新しいし、多くのプログラムを書いていない。 –

+1

いいえ、あなたはいいです。 forループは、a = -100、b = -100、およびc = -100で始まります。それからcは1になり100に達する。そしてcは-100にリセットされ、bは1になる。これは、bが100に達する(そしてcが100回以上になる)まで繰り返され、その後、bは-100にリセットされ、aは1増加する。それはa = 100まで何度も繰り返され、その後、ループは終了する。 – kamoroso94

+1

forループはネストされているため、forループの外側を実行する回数だけ内部forループを実行します。だから、あなたが(x、1,2){((y、1,2){(z、1,2){}}}のような構造を持っていたら、それは(1,1,1)を通ります。 (1,1,2)、(1,2,1)、(1,2,2)、(2,1,1)、(2,1,2)、(2,2,1)、(2 、2,2)。それは理にかなっていますか? – kamoroso94

1

これを試してみてください:

public class Main { 
    // a√2 - b = c√3 
    public static void main(String args[]) throws IOException { 

    for (int a = -100; a < 100; a++) { 
     for (int b = -100; b < 100; b++) { 
     for (int c = -100; c < 100; c++) { 
      // System.out.println(a +" "+b+" "+c); 

      if (BigDecimal.valueOf(a).multiply(BigDecimal.valueOf(Math.sqrt(2))).subtract(BigDecimal.valueOf(b)) 
       .equals(BigDecimal.valueOf(c).multiply(BigDecimal.valueOf(Math.sqrt(3))))) { 
      System.out.println(a + " " + b + " " + c); 

      } 

     } 
     } 
    } 

    } 
} 
1

お試しください。

double sqrt2 = Math.sqrt(2.0); 
    double sqrt3 = Math.sqrt(3.0); 
    double threshold = 1e-10; 
    double from = -100; 
    double to = 100; 
    double inc = 1.0; 

    for (double a = from; a <= to; a += inc) { 
     for (double b = from; b <= to; b += inc) { 
      for (double c = from; c <= to; c += inc) { 

       if (Math.abs(a * sqrt2 - b - c * sqrt3) < threshold) { 
        System.out.println("a:" + a + " b:" + b + " c:" + c); 
       } 
      } 
     } 
    } 

いくつかのポイント:

  • あなたは-100と100の間のすべての数字を言うとき、それは曖昧です。 2つの間には無制限の実数があります。 の整数が必要な場合は、それは有限集合です。実数が の場合は、コード内で良いincを選択する必要があります。 は、incが小さいほど、試してみる数字が増えます。
  • 2番目の部分は、あなたの等価を近似値にする必要がある場合です。繰り返しますが、正確に等しくしたい場合は、唯一の答えは3つの0です。この場合、ifの条件で(a * sqrt2 - b == c * sqrt3)を使用してください。しかし、少数の小数点の違いが許容できる場合は、上記のコードで正しいしきい値を選ぶだけで、さらに多くの回答が得られます。
1

最初にプログラムですべての結合がチェックされていません。これは、a = -100 b = -100 c = -100で始まりますが、各繰り返しでは、bとcは1ずつ増加します。これは、各繰り返しでa == bとb == cを意味します。 可能なすべての組み合わせをチェックするには

public class BruteChecker{ 
    public static void main(String args[]){ 
     for(double a = -100;a <= 100;a++){ 
      for(double b = -100; b <= 100; b++){ 
       for(double c =-100; c <= 100; c++){ 
        if(a * Math.sqrt(2) - b == c * Math.sqrt(3)){ 
         System.out.println(a + " * sqrt(2) - " + b + " = " + c + " * sqrt(3)"); 
        } 
       } 
      } 
     } 
    } 
} 
関連する問題