java中勾股三元组的高效算法

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让我先说一句,我对毕达哥拉斯的三元组或其背后的数学知识并不熟悉。我只是觉得这是一个有

所以我尝试用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的可能值时,知道你在寻找什么。给定

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;
        }
    }
}