0

我需要找到 A 和 B 的值小于 100 的所有毕达哥拉斯三元组 (a^2+b^2=c^2)。我的代码没有给我正确的输出。谁能告诉我我的代码出了什么问题并改写正确的代码?

public static void main(String[] args) {

    int sum = 0;

    for (int num1 = 1; num1 <= 100; num1++) {
        for (int num2 = 1; num2 < 100; num2++) {
            if (PerfectSquare(num1, num2, sum)) {
                System.out.println(num1 + " " + num2);
            }
        }
    }
}

public static boolean PerfectSquare(int number1, int number2, int sum) {

    int square1;
    int square2;
    double root;
    int sum1;

    number1 = (int) ((99 - 1 + 1) * Math.random() + 1);
    number2 = (int) ((99 - 1 + 1) * Math.random() + 1);

    square1 = (int) Math.pow(number1, 2.0);
    square2 = (int) Math.pow(number2, 2.0);
    sum = square1 + square2;
    root = Math.sqrt(sum);
    sum1 = (int) Math.pow(root, 2.0);

    if (!(sum == sum1)) {
        return false;
    }

    return true;
}
4

1 回答 1

1

您正在用随机数覆盖您的number1和参数:number2

number1 = (int) ((99 - 1 + 1 ) * Math.random() + 1);
number2 = (int) ((99 - 1 + 1 ) * Math.random() + 1);

如果您这样做,您可能根本不会将任何值传递给该方法。删除这些行。

此外,您需要将平方根四舍五入为整数:

root = (int) Math.sqrt(sum);

因为否则当你再次平方它时,你最终会得到相同的数字。


其他与正确性无关的点:

  • 您可以平方整数而无需通过将它们与自身相乘来进行转换:

    square1 = number1 * number1;
    
  • 这个:

    if (! (sum==sum1) ) {
    

    更容易写成

    if (sum != sum1) {
    
  • 您的sum方法参数是不必要的。将其声明为局部变量。

  • 您不需要遍历所有对num1and num2,因为如果(num1, num2)是毕达哥拉斯三元组的对边和相邻边,那么(num2, num1)显然也是(类似地,如果num1num2不是,那么num2num1都不是)。因此,您可以使用以下方法检查更少的组合:

    for (int num1 = 1; num1 <= 100 ; num1++) {
      for (int num2 =1; num2 <num1; num2++) {
    
于 2015-12-02T21:36:33.580 回答