0

A と B の値が 100 未満のすべてのピタゴラス トリプル (a^2+b^2=c^2) を見つける必要があります。私のコードでは正しい出力が得られません。誰かが私のコードの何が問題だったのかを教えて、代わりに正しいコードを書いてもらえますか?

public static void main(String[] args) {

    int sum = 0;

    for (int num1 = 1; num1 <= 100; num1++) {
        for (int num2 = 1; num2 < 100; num2++) {
            if (PerfectSquare(num1, num2, sum)) {
                System.out.println(num1 + " " + num2);
            }
        }
    }
}

public static boolean PerfectSquare(int number1, int number2, int sum) {

    int square1;
    int square2;
    double root;
    int sum1;

    number1 = (int) ((99 - 1 + 1) * Math.random() + 1);
    number2 = (int) ((99 - 1 + 1) * Math.random() + 1);

    square1 = (int) Math.pow(number1, 2.0);
    square2 = (int) Math.pow(number2, 2.0);
    sum = square1 + square2;
    root = Math.sqrt(sum);
    sum1 = (int) Math.pow(root, 2.0);

    if (!(sum == sum1)) {
        return false;
    }

    return true;
}
4

1 に答える 1

1

number1パラメータとnumber2パラメータを乱数で上書きしています:

number1 = (int) ((99 - 1 + 1 ) * Math.random() + 1);
number2 = (int) ((99 - 1 + 1 ) * Math.random() + 1);

これを行う場合、メソッドに値をまったく渡さないこともできます。これらの行を削除します。

また、平方根を整数に丸める必要があります。

root = (int) Math.sqrt(sum);

そうしないと、もう一度二乗すると同じ数になってしまうからです。


正確性に関連しないその他のポイント:

  • 整数を自分自身で乗算することにより、キャストする必要なく整数を二乗できます。

    square1 = number1 * number1;
    
  • これ:

    if (! (sum==sum1) ) {
    

    次のように書く方が簡単です

    if (sum != sum1) {
    
  • メソッドsumパラメータは不要です。ローカル変数として宣言します。

  • num1andのすべてのペアをループする必要はありませんnum2。なぜなら、 if(num1, num2)がピタゴラスの三重要素の反対側で隣接する側であるからです(num2, num1)(同様に、 ifnum1num2are not の場合、 num2andもそうではありnum1ません)。そのため、次を使用してより少ない組み合わせを確認できます。

    for (int num1 = 1; num1 <= 100 ; num1++) {
      for (int num2 =1; num2 <num1; num2++) {
    
于 2015-12-02T21:36:33.580 に答える