1

所以我尝试使用java制作一个程序。它的输入是整数,整数被认为是3个整数a、b和c(· a^2 + b^2 = c^2)之和,它的输出是c^2。为此,我扩展了等式并合并a^2 + b^2 - c^2 = 0c = sum - a - b得到Math.pow(sum, 2) - 2 * sum * (a + b) + 2 * a * b。然后我得到a + b <= sum*2/3然后我将a,b的所有组合代入等式中以查看它何时为零。

这是我的代码:

/** Pythagorean Triples
  * test case for small numbers
  * Tony
  */
import java.util.*;

public class Solution54 {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);


    int times = sc.nextInt();

    for (int i = 0; i < times; i++) {
      /* prompt the sum and get the equation:
       * Math.pow(sum, 2) - 24 * (a + b) + 2a*b = 0;
       * we consider b >= a;
       */
      double sum = sc.nextDouble();
      double ablimits = Math.floor(sum / 3 * 2); // a + b <= ablimits
      double alimits = Math.floor(ablimits / 2); // a <= alimits
      //System.out.println("another round");
      //System.out.print(alimits + " " + blimits);
      A: for (double a = 1; a <= alimits; a++) {
        B: for (double b = a; b <= sum - a; b++) {
          double result = Math.pow((sum-a-b),2)-a*a-b*b;
          //System.out.print("when a is " + a + " " + "when b is " + b + ":" + result + ";");
          if (Math.pow(sum, 2) - 2 * sum * (a + b) + 2 * a * b == 0) {
            double answer = a*a + b*b;
            int output = (int)answer;
            System.out.print(output + " ");
            break A;
          }
        }
      }

    }
  }
}

当我输入1 12时,它给出 25(因为a,b,c=3,4,5; c^2 = 25),但它无法处理大输入,14808286因为我的算法效率不够高。这样做的有效方法是什么?请!

4

1 回答 1

1

让我先说我对毕达哥拉斯三元组或它们背后的数学没有深入的了解。我只是认为这是一个有趣的问题,所以我试了一下。

我相信这个问题的关键是在扫描 a 的可能值时知道你在寻找什么。给定

a + b + c = sum

a^2 + b^2 = c^2

你会发现

b = (sum / 2) * (1 - (a / (sum - a)))
  = (sum / 2) - ((a * sum) / (2 * (sum - a)))

你知道 b 必须是一个整数。毕达哥拉斯三元组的一个有趣特性是它们的总和总是偶数。这意味着

(sum / 2) % 1 = 0

所以我们真正需要检查以确保 b 有效(即整数)是

((a * sum) / (2 * (sum - a))) % 1 = 0

或者,更简单地说,

(a * sum) % (sum - a) = 0

至少如您所说,简化此问题的其他一些关键点:

  • 一旦你有了 a,b 就可以使用这个答案中的第三个方程来计算。
  • 一旦有了 a 和 b,c 就可以很容易地从任何一个毕达哥拉斯三重方程中得出。
  • 您只需要打印 c^2 作为输出。一旦完成,你就可以打破。

代码最终变得非常简单:

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    // Get the sum from System.in.
    int sum = sc.nextInt();

    // If the given sum is odd, return immediately.
    // No Pythagorean triple will have an odd sum.
    if ((sum ^ 1) == 1) {
        return;
    }

    // Try all values of a within the expected bounds.
    int aBound = sum / 2;
    for (int a = 1; a < aBound; a++) {
        // Check whether b would be a whole number with this value of a.
        if ((a * sum) % (a - sum) == 0) {
            int b = (sum * (2 * a - sum)) / (2 * a - 2 * sum);
            int c = sum - a - b;
            System.out.println((int)Math.pow(c, 2));
            break;
        }
    }
}

值得注意的是,由于我对毕达哥拉斯三元组缺乏深入的数学理解,因此很可能在决定实际需要检查 a 的哪些值时可以进行一些进一步的优化。我想有一些数学标准。

我希望这有帮助!

于 2016-10-13T03:44:05.377 回答