java中勾股三元组的高效算法
所以我尝试用java编写一个程序。 它的输入是整数,整数被认为是3个整数a、b和c的和(java中勾股三元组的高效算法,java,algorithm,pythagorean,Java,Algorithm,Pythagorean,所以我尝试用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=a; */ double sum=sc.nextDouble(); 双重烧蚀=数学地板(总和/3*2);//a+b让我先说一句,我对毕达哥拉斯的三元组或其背后的数学知识并不熟悉。我只是觉得这是一个有
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=a;
*/
double sum=sc.nextDouble();
双重烧蚀=数学地板(总和/3*2);//a+b让我先说一句,我对毕达哥拉斯的三元组或其背后的数学知识并不熟悉。我只是觉得这是一个有趣的问题,所以我试了一下
我相信这个问题的关键是当你浏览a的可能值时,知道你在寻找什么。给定
a + b + c = sum
及
你会发现
b = (sum / 2) * (1 - (a / (sum - a)))
= (sum / 2) - ((a * sum) / (2 * (sum - a)))
你知道b必须是一个整数。毕达哥拉斯三元组一个有趣的性质是它们的和总是偶数。也就是说
(sum / 2) % 1 = 0
所以我们真正需要检查以确保b是有效的(即一个整数),就是
或者,更简单地说
(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;
}
}
}
publicstaticvoidmain(字符串[]args){
扫描仪sc=新的扫描仪(System.in);
//从System.in获取总和。
int sum=sc.nextInt();
//如果给定的总和为奇数,请立即返回。
//任何毕达哥拉斯的三元组都不会有奇数和。
如果((和^1)==1){
返回;
}
//在预期范围内尝试a的所有值。
int丰富=总和/2;
for(int a=1;a
值得注意的是,因为我对毕达哥拉斯三元组缺乏深入的数学理解,所以在决定实际需要检查a的哪些值时,很可能需要进行进一步的优化。我想这有一些数学标准
我希望这有帮助 我不懂你最初的一些数学。这个等式是从哪里来的:c=sum-a-b
?你是说你想输入一个名为sum
的整数,其中sum=a+b+c
,整数a
,b
和c
是勾股三元组,让程序输出c
?@PEF是的,我是说that@TimBiegeleisen因为sum=a+b+c,所以c=sum-a-b
这看起来非常像and。嗨,这是你介绍给我的一个好方法,只有一件事我不明白,你怎么知道b=(sum/2)*(1-(a/(sum-a))=(sum/2)-((a*sum)/(2*(sum-a))
?嗨@Tony,我通过为c
解a+b+c=sum
,将c=sum-a-b
插入a^2+b^2=c^2
并根据a
和sum>解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;
}
}
}