所以我尝试用java创建一个程序。
它的输入是整数,整数被认为是3个整数a,b和c(a^2 + b^2 = c^2
)的总和,其输出是c ^ 2。为此,我将方程式a^2 + b^2 - c^2 = 0
和c = 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!
答案 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
其他一些简化此问题的关键点,至少在你已经说过:
代码最终非常简单:
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;
}
}
}
值得注意的是,由于我对毕达哥拉斯三元组缺乏深刻的数学理解,因此在决定实际需要检查哪些值时,可能会进行一些进一步的优化。我想象那里有一些数学标准。
我希望这有帮助!