Решение сложного уравнения с двумя переменными на Java

StackOverflow https://stackoverflow.com/questions/8826301

  •  27-10-2019
  •  | 
  •  

Вопрос

Мое задание говорит о том, чтобы сделать следующее:
SEARK2: Поиск решения x*x + y*y - 12x -10y + 36 = 0. Поиск от 0 до 10 в x и y, поиск каждого значения y, прежде чем перейти к следующему x. Распечатайте первые три решения найденных. (ПРИМЕЧАНИЕ - ЗДЕСЬ ПРОИЗВОДИТЕЛЬНЫЙ ПЕРЕКЛЮЧЕНИЕ!)

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

Решение

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

  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)

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

Другие советы

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

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

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

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

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

Также может быть разумно переименовать i а также j к X и Y, для ясности. Вы в основном на правильном пути, хотя. Не забывайте, что вам нужно только распечатать первые три решения.

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

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

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

        }

    }

}

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top