Решение сложного уравнения с двумя переменными в Java - PullRequest
0 голосов
/ 12 января 2012

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

Я не могу понять логику для этого.Я думаю, что я должен использовать более 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 + ")");  
        }  
    }  
}  

ОБНОВЛЕНИЕ
Вотрешение:

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

Ответы [ 7 ]

2 голосов
/ 12 января 2012

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

  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 голосов
/ 12 января 2012

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

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

}
0 голосов
/ 12 января 2012
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 голосов
/ 12 января 2012
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;, так как в противном случае вы все равно искали бы решения, хотя вы уже нашли их.Если вы не хотите больше решений, вам следует пропустить утверждение «return».

0 голосов
/ 12 января 2012

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

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

0 голосов
/ 12 января 2012

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

0 голосов
/ 12 января 2012

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

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

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

Вам нужно заменить его на if.

...