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

时间:2016-04-29 12:31:10

标签: 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 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;
   }

5 个答案:

答案 0 :(得分:4)

是, 如果(i*i) + (j*j) == low没有一个评估为真,则while将无限循环。

答案 1 :(得分:1)

您没有正确使用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;
}

为清楚起见,您可能还应考虑创建一个isBisquare(int)方法,如下所示:

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

bisquare方法(应该有一个更好的名称,比如countBisquares)现在看起来像这样:

public static int countBisquares(int low, int high)
{      
    int count = 0;
    for (int checkNum = low; checkNum < high; checkNum++)
    {
        if (isBisquare(checkNum))
        {
            count++;
        }
    }
    return count;
}

答案 2 :(得分:1)

您的代码存在一些问题。

首先是循环

while (!isBisquare) {
    // some code
}

此循环中的代码每次都以完全相同的方式执行,因此如果循环中的代码第一次执行时没有找到bisquare,则biSquare不会设置为true,并且在进一步的迭代中不会设置为true ,导致无限循环。

第二个问题是这一行:

if ((i*i) + (j*j) == low) {

我认为这应该是

if ((i*i) + (j*j) == checkNum) {

否则你总是检查范围内的最低数字是否是双方。

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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

除非做出这种改变,否则它不会认为它会计算实际的高值和低值。