这是一个无限循环吗?我做错了什么?(Java方法)

这是一个无限循环吗?我做错了什么?(Java方法),java,algorithm,Java,Algorithm,我应该写一个bisquare方法,返回一系列数字中的bisquare数。我想我已经找到了答案,但当我运行这个代码时,什么都没有显示,我的笔记本电脑开始疯狂地呼呼作响。系统从来没有说它结束了 这是我的密码。我做错了什么?如果设置不正确,我也在寻找问题的解决方案 // An integer that is the sum of the squares of two other integers is called bisquare // 5 is bisquare because it

我应该写一个bisquare方法,返回一系列数字中的bisquare数。我想我已经找到了答案,但当我运行这个代码时,什么都没有显示,我的笔记本电脑开始疯狂地呼呼作响。系统从来没有说它结束了

这是我的密码。我做错了什么?如果设置不正确,我也在寻找问题的解决方案

   // An integer that is the sum of the squares of two other integers is called bisquare
   // 5 is bisquare because it is 1*1 + 2*2
   // 4 is bisquare because it is 0*0 + 2*2  (we can use 0 as one of our numbers)
   // 8 is bisquare because it is 2*2 + 2*2  (we can use the same two numbers)
   // 3 is not bisquare, 6 is not bisquare
   //  
   // Given two int parameters, low and high, return the number of bisquares that
   // fall between low and high (inclusive)
   // 
   // EXAMPLES:
   // low = 1, high = 6
   // return 4
   // 1, 2, 4, and 5 are bisquare.  3 and 6 are not
   //
   // low = 7, high = 7
   // return 0
   // 7 is not bisquare.  that is the entire range we are checking. 

   public static int bisquare(int low, int high)
   {      
      int count = 0;
      boolean isBisquare = false;
      for (int checkNum = low; checkNum < high; checkNum++) {
         while (!isBisquare) {
            for (int i = 0; i < high; i++) {
               for (int j = 0; j < high; j++) {
                  if ((i*i) + (j*j) == low) {
                     count++;
                     isBisquare = true;
                  }
               }
            }   
         }
      }
      return count;
   }
对, 如果i*i+j*j==low的计算结果都不是真的,那么while将无限循环。

是, 如果i*i+j*j==low的计算结果均为true,则while将无限循环。

您没有正确使用checkNum变量。应该在内部两个for循环中使用它。此外,while循环是不必要的,它为非二次方的数字创建了一个无限循环

public static int bisquare(int low, int high)
{      
    int count = 0;
    for (int checkNum = low; checkNum < high; checkNum++)
    {
        outerloop:
        for (int i = 0; i < checkNum; i++)
        {
            for (int j = 0; j < checkNum; j++)
            {
                if (i * i + j * j == checkNum)
                {
                    count++;
                    break outerloop;
                }
            }
        }
    }
    return count;
}
bisquare方法应该有一个更好的名称,比如CountBiSquare,现在看起来如下:

public static boolean isBisquare(int n)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (i * i + j * j == n)
            {
                return true;
            }
        }
    }
    return false;
}
public static int countBisquares(int low, int high)
{      
    int count = 0;
    for (int checkNum = low; checkNum < high; checkNum++)
    {
        if (isBisquare(checkNum))
        {
            count++;
        }
    }
    return count;
}
您没有正确使用checkNum变量。应该在内部两个for循环中使用它。此外,while循环是不必要的,它为非二次方的数字创建了一个无限循环

public static int bisquare(int low, int high)
{      
    int count = 0;
    for (int checkNum = low; checkNum < high; checkNum++)
    {
        outerloop:
        for (int i = 0; i < checkNum; i++)
        {
            for (int j = 0; j < checkNum; j++)
            {
                if (i * i + j * j == checkNum)
                {
                    count++;
                    break outerloop;
                }
            }
        }
    }
    return count;
}
bisquare方法应该有一个更好的名称,比如CountBiSquare,现在看起来如下:

public static boolean isBisquare(int n)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (i * i + j * j == n)
            {
                return true;
            }
        }
    }
    return false;
}
public static int countBisquares(int low, int high)
{      
    int count = 0;
    for (int checkNum = low; checkNum < high; checkNum++)
    {
        if (isBisquare(checkNum))
        {
            count++;
        }
    }
    return count;
}

您的代码有一些地方出错

首先是循环

while (!isBisquare) {
    // some code
}
此循环中的代码每次执行的方式完全相同,因此,如果在循环中的代码第一次执行时未找到bisquare,则bisquare不会设置为true,并且在进一步的迭代中将不会设置为true,从而导致无限循环

第二个问题是这一行:

if ((i*i) + (j*j) == low) {
我想这应该是

if ((i*i) + (j*j) == checkNum) {
否则,无论是否为双正方形,都会检查该范围内的最小数字

将这两个错误结合起来,无论参数low的值是多少,只要参数low不是bisquare,就会得到一个无限循环


编辑:最初我没有注意到您打算对while循环做什么。在阅读了一些讨论之后,我意识到这是为了防止一个数字被数到多次。我建议使用@Clashsoft的第二种解决方案。这使代码更具可读性和可重用性。

您的代码存在一些问题

首先是循环

while (!isBisquare) {
    // some code
}
此循环中的代码每次执行的方式完全相同,因此,如果在循环中的代码第一次执行时未找到bisquare,则bisquare不会设置为true,并且在进一步的迭代中将不会设置为true,从而导致无限循环

第二个问题是这一行:

if ((i*i) + (j*j) == low) {
我想这应该是

if ((i*i) + (j*j) == checkNum) {
否则,无论是否为双正方形,都会检查该范围内的最小数字

将这两个错误结合起来,无论参数low的值是多少,只要参数low不是bisquare,就会得到一个无限循环


编辑:最初我没有注意到您打算对while循环做什么。在阅读了一些讨论之后,我意识到这是为了防止一个数字被数到多次。我建议使用@Clashsoft的第二种解决方案。这使代码更具可读性和可重用性。

您的逻辑不正确。以下是正确的答案:

    public static int bisquare(int low, int high) {
        int count = 0;
        boolean isBisquare = false;
        for (int checkNum = low; checkNum < high; checkNum++) {
            for (int i = 0; i < checkNum && !isBisquare; i++) {
                for (int j = 0; j < checkNum && !isBisquare; j++) {
                    if (((i * i) + (j * j)) == checkNum) {
                        count++;
                        isBisquare = true;
                    }
                }
            }
            isBisquare = false;
        }
        return count;
    }

你的逻辑不正确。以下是正确的答案:

    public static int bisquare(int low, int high) {
        int count = 0;
        boolean isBisquare = false;
        for (int checkNum = low; checkNum < high; checkNum++) {
            for (int i = 0; i < checkNum && !isBisquare; i++) {
                for (int j = 0; j < checkNum && !isBisquare; j++) {
                    if (((i * i) + (j * j)) == checkNum) {
                        count++;
                        isBisquare = true;
                    }
                }
            }
            isBisquare = false;
        }
        return count;
    }

我已经尝试了上面的一些解决方案,我相信我在上面的所有解决方案中都发现了一个错误。在所有for循环中,checkNum应小于或等于high,i或j应小于或等于checkNum

当给出10的高值和1的低值时,进行这些更改将给出答案7。如果没有这些变化,答案是5给定相同的输入


除非进行此更改,否则它不会计算实际的高值和低值。

我已经尝试了上面的一些解决方案,我相信我在上面的所有解决方案中都发现了错误。在所有for循环中,checkNum应小于或等于high,i或j应小于或等于checkNum

当给出10的高值和1的低值时,进行这些更改将给出答案7。如果没有这些变化,答案是5给定相同的输入


除非进行此更改,否则它不会计算实际的高值和低值。

您的输入是什么?checkNum应该做什么?checkNum的用途是什么?如果low不是两个平方数的和,那么它永远不会结束。。。例如,low=7。参见费马的一个鲜为人知的定理:一个数N可表示为2个平方和,当且仅当在N的素因式分解中,形式为4k+3的每个素出现偶数次。您可以使用它来实现您的解决方案。它可能会更快。你的输入是什么?checkNum应该做什么?checkNum有什么用?如果low不是两个平方数的和,那么它永远不会结束。。。例如,low=7。参见费马的一个鲜为人知的定理:一个数N可表示为2个平方和,当且仅当在N的素因式分解中,形式的每个素
4k+3出现的次数为偶数。您可以使用它来实现您的解决方案。可能会更快。谢谢,你说得对!我能做些什么作为替代解决方案?确保你的增量很低,这样你就可以移动到下一个数字,并更改条件以限制下限可以增加多少。或者,当你找到你的数字时,只增加checkNum并用low迭代。Sorin,我希望我能接受你的评论作为答案,这很有帮助!我最终增加了checkNum,它成功了。谢谢你,你说得对!我能做些什么作为替代解决方案?确保你的增量很低,这样你就可以移动到下一个数字,并更改条件以限制下限可以增加多少。或者,当你找到你的数字时,只增加checkNum并用low迭代。Sorin,我希望我能接受你的评论作为答案,这很有帮助!最后我增加了checkNum,它成功了。谢谢,但是如果我实现了这个,那么如果low=1,high=10,它将返回10,这是不正确的。这是因为嵌套for循环对某些数字计数两次。示例:4生成0*0+2*2和2*2+0*0。这就是为什么我觉得有必要使用while循环来打破这种局面。单独的方法是必要的,一个数字可以用多种方式进行二次方运算。但只有一种方式应该被计算在内。对于第一个要工作的示例,应该使用标签在count++之后中断。我会做一个建议的编辑。不幸的是,我不允许在这个解决方案中使用单独的方法,尽管我很感激你的努力。我接受了编辑。在这种情况下,需要使用中断或继续最外层的循环;用while循环无法以一种合理的方式解决这个问题。不太确定这是否有效。。。0,1和1,0不是都返回true吗?谢谢,但是如果我实现了这个,那么如果low=1和high=10,它将返回10,这是不正确的。这是因为嵌套for循环对某些数字计数两次。示例:4生成0*0+2*2和2*2+0*0。这就是为什么我觉得有必要使用while循环来打破这种局面。单独的方法是必要的,一个数字可以用多种方式进行二次方运算。但只有一种方式应该被计算在内。对于第一个要工作的示例,应该使用标签在count++之后中断。我会做一个建议的编辑。不幸的是,我不允许在这个解决方案中使用单独的方法,尽管我很感激你的努力。我接受了编辑。在这种情况下,需要使用中断或继续最外层的循环;用while循环无法以一种合理的方式解决这个问题。不太确定这是否有效。。。0,1和1,0不是都返回true吗?我会把布尔值isBisquare=false;在第一个for循环中:这是使用它的范围,并且更清楚地表明它的值不应该被带入下一个迭代。这是一个很好的解决方案——我和其他回答者显然没有注意到这正是他打算对伊斯比斯夸尔所做的。你应该解释他的错误,而不是仅仅给出代码;在第一个for循环中:这是使用它的范围,并且更清楚地表明它的值不应该被带入下一个迭代。这是一个很好的解决方案——我和其他回答者显然没有注意到这正是他打算对伊斯比斯夸尔所做的。你应该解释他的错误,而不是仅仅给出代码。