java中

时间:2016-10-13 01:51:49

标签: java algorithm pythagorean

所以我尝试用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这样的大输入,因为我的算法效率不高。有效的方法是什么? PLZ!

1 个答案:

答案 0 :(得分: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;
        }
    }
}

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

我希望这有帮助!