2016-04-29 2 views
1

Я должен написать метод «bisquare», который возвращает число бискваров в диапазоне чисел. Я думал, что понял, но когда я запускаю этот код, ничего не отображается, и мой ноутбук начинает крутиться как сумасшедший. Система никогда не говорит, что она закончилась.Это бесконечный цикл? Что я делаю не так? (Метод Java)

Вот мой код. Что я делаю не так? (Я также ищет решение проблемы, если я не настраивая это правильно.)

// 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; 
    } 
+2

Каковы ваши входы? – Hackerdarshi

+0

Что должен делать 'checkNum'? –

+0

что использовать 'checkNum' – Sanjeev

ответ

4

Да, Если ни один из (i*i) + (j*j) == low не имеет значение истинно, в то время как будет цикл бесконечно.

+0

Спасибо, ты прав! Что я могу сделать в качестве альтернативного решения? –

+1

Удостоверьтесь, что вы увеличиваете низкий уровень, чтобы перейти к следующему номеру и изменить условие, чтобы ограничить максимально возможное увеличение. – Sorin

+1

Альтернативно, только увеличивайте checkNum, когда вы находите свой номер и итерации с низким. – Sorin

1

Вы не используете переменную checkNum правильно. Он должен использоваться во внутренних двух циклах. Кроме того, цикл 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; 
} 
+0

Спасибо, но если я реализую это, то если low = 1 и high = 10, он вернет 10, что неверно. Это связано с тем, что вложенные петли посчитали несколько чисел в два раза. Пример: 4 выхода (0 * 0) + (2 * 2) и (2 * 2) + (0 * 0). Вот почему я почувствовал необходимость использовать цикл while, чтобы вырваться из этого. –

+1

Необходимо использовать отдельный метод, число может быть biSquared более чем одним способом. Но нужно учитывать только один путь. Для того, чтобы первый пример работал, вы должны перерыв после '' 'count ++' '', используя метку. Я сделаю предлагаемое редактирование. –

+0

К сожалению, мне не разрешен отдельный метод в этом решении, хотя я ценю усилия. –

1

В коде есть некоторые ошибки.

Первое, что петля

while (!isBisquare) { 
    // some code 
} 

Код в этом цикле выполняется точно так же, как каждый раз, так что если не bisquare не найден первый раз, код в цикле выполняет, biSquare является не установлен в true и не будет установлен в true при последующих итерациях, что приведет к бесконечному циклу.

Вторая проблема эта линия:

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

Я думаю, что это должно быть

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

иначе вы всегда проверять наименьшее число в диапазоне, является ли это bisquare.

Объедините эти две ошибки, и вы получите бесконечный цикл всякий раз, когда низкий аргумент не является бискваром, независимо от значения high.

EDIT: Первоначально я не заметил, что вы хотели сделать с циклом while. Прочитав некоторые из обсуждений, я понимаю, что это было предотвращение подсчета одного числа несколько раз. Я предлагаю использовать второе решение @ Clashsoft. Это делает код более читаемым и многоразовым.

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

Я бы поставил 'boolean isBisquare = false;' в первом цикле for: это область, в которой она используется, и дает более четкое представление о том, что ее значение не должно переноситься на следующую итерацию. Это хорошее решение - я (и другие ответчики, видимо, не заметили, что он имел в виду «isBisquare». Вы должны объяснить свою ошибку, а не просто давать код. – Oebele

0

Я пробовал некоторые из вышеперечисленных решений, и я считаю, что нашел ошибку во всех вышеупомянутых решениях.В все для циклов for, checkNum должно быть меньше или , равное, и i или j должно быть меньше или , равное checkNum.

Выполнение этих изменений даст ответ 7 при задании максимума 10 и минимума 1. без этих изменений, ответ будет 5 с теми же входами.

Не думайте, что он когда-либо будет считать фактические высокие и низкие значения, если это изменение не будет сделано.

Смежные вопросы