2012-01-11 2 views
0

В моем задании указано, что нужно сделать следующее:
Search2: Найти решение x * x + y * y - 12x -10y + 36 = 0. Искать от 0 до 10 и в x и y, ищем каждое значение y перед переходом к следующему x. Распечатайте первые три найденных решения. (Примечание - здесь помечен перерыв!)Решение сложного уравнения с двумя переменными в Java

Я не могу понять логику этого. Я думаю, что мне нужно использовать более 2 петель, но не уверен.
Это то, что я до сих пор (это просто повторяет (6,0)):

for (int j = 0; j <= 10; j++) { 
    for (int i = 0; i <= 10; i++) { 
     while (((i * i) + (j * j) - (12 * i) - (10 * j) + 36) == 0) { 
      System.out.println("(" + i + ", " + j + ")"); 
     } 
    } 
} 

UPDATE
Вот решение:

int t = 0; 

    for (int i = 0; i <= 10; i++) { 
     if (t == 3) { 
      break; 
     } 
     for (int j = 0; j <= 10; j++) { 
      if (((i * i) + (j * j) - (12 * i) - (10 * j) + 36) == 0) { 
       System.out.println("(" + i + ", " + j + ")"); 
       t++; 
      } 
     } 
    } 
+0

Обратите внимание, что перерыв вы там только прерывает внутреннюю 'for' петли. Посмотрите внимательно на заключительную заметку в задании! – fivedigit

ответ

2

Неплохая попытка. Поскольку вы так близко, я покажу вам рабочее решение. В принципе, вам нужно сделать три вещи:

  1. Изменить while для if
  2. Используйте переменную для подсчета количества раз вы найти решение, так что вы можете остановиться на трех
  3. Добавить метку, чтобы вы может выйти из внешнего контура внутри внутреннего цикла

Я также рекомендую вам использовать имена переменных так же, как проблему - т.е. x и y - для ясности.

int count = 0; 
outerLoop: 
for (int y = 0; y <= 10; y++) { 
    for (int x = 0; x <= 10; x++) { 
     if (x * x + y * y - 12 * x - 10 * y + 36 == 0) { 
      System.out.println("(" + x + ", " + y + ")"); 
      if (++count == 3) 
       break outerLoop; 
     } 
    } 
} 

При выполнении этого кода производит:

(6, 0) 
(3, 1) 
(9, 1) 

Извините за ложку-подающим вас, но часть урока здесь хороший стиль и практика кодирования.

0

Вы используете дополнительный while цикл который работает неопределенно.

while (((i * i) + (j * j) - (12 * i) - (10 * j) + 36) == 0) { 
    System.out.println("(" + i + ", " + j + ")"); 
} 

В первый раз это имеет значение истинно - то есть, когда он достигает (6,0) - он будет продолжать работать, потому что i и j не изменяются внутри.

Необходимо заменить его на if.

+0

@ JBNizet exatly, я увидел ошибку, как только я попал в submit. Я редактировал сейчас. –

+0

О, хорошо! И я поставил цикл «i» перед «j», чтобы он правильно оценил. –

+0

Я понял! Ill опубликуйте решение в оригинальном посте прямо сейчас! –

0

Взгляните на внутренний цикл, который у вас есть. Как только решение уравнения найдено, i и j никогда не меняются, и формула всегда оценивается как 0, что приводит к бесконечному циклу.

Возможно, было бы разумно переименовать i и j в x и y, для ясности. Хотя вы в основном на правильном пути. Не забывайте, что вам нужно распечатать первые три решения.

0

Я не буду вам очень помогать, так как это довольно простая концепция, но подумайте о том, что вам нужно пройти, это может облегчить использование x и y instad i или j. Также ваша печать (6,0), потому что это именно то, что вы сказали ей делать с циклом while.

Один подсказку, ваш цикл while должен иметь инструкцию, которая останавливает его функцию, скажем, если x < 4, если она когда-либо больше или = до, чем она будет продолжаться за пределами цикла.

-2
for (int j = 0; j <= 10; j++) 
{ 
    for (int i = 0; i <= 10; i++) 
    { 
     if (((i * i) + (j * j) - (12 * i) - (10 * j) + 36) == 0) 
     { 
     System.out.println("(" + i + ", " + j + ")"); 
     return; 
     } 
    } 
} 

Это импорт помнить return; часть, как вы бы в противном случае по-прежнему искать решения, хотя вы уже нашли один. Если у вас больше решений, тогда вам следует опустить заявление «Возвращение».

0
public class EquationSolver { 

    public static void main(String[] args) { 

     int found = 0; 
     searchSolutions: 
     for (int y = 0; y <= 10; y++) { 
      for (int x = 0; x <= 10; x++) { 
       if (((x * x) + (y * y) - (12 * x) - (10 * y) + 36) == 0) { 
        System.out.println("(" + x + ", " + y + ")"); 
        found ++; 
        if (found == 3) { 
         break searchSolutions; 
        } 
       } 
      } 

     } 

    } 

} 
0

Долгое время я в последний раз писал домашнее задание в этом роде ... просто для удовольствия :)

public class Main { 

    public static void main(String[] args) { 
     int[] range = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
     boolean isSolutionFound = Boolean.FALSE; 
     int solCounter = 0; 

     searchSolutions: 
     for (Integer y : range) { 
      for (Integer x : range) { 
       isSolutionFound = checkForSolution(x, y); 
       if (isSolutionFound) { 
        printSolution(x, y); 
        solCounter++; 
       } 

       if (solCounter == 3) 
        break searchSolutions; 
      } 
     } 
    } 

    private static void printSolution(Integer x, Integer y) { 
     System.out.println(x + "," + y); // use some fancy formatting instead 
    } 

    private static boolean checkForSolution(int x, int y) { 
     if (x * x + y * y - 12 * x - 10 * y + 36 == 0) 
      return true; 
     else 
      return false; 
    } 

}