Решение сложного уравнения с двумя переменными на Java
-
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++;
}
}
}
Решение
Неплохая попытка. Потому что ты так близко, я покажу тебе рабочее решение. По сути, вам нужно сделать три вещи:
- Изменять
while
кif
- Используйте переменную, чтобы подсчитать количество раз, когда вы найдете решение, чтобы вы могли остановиться на три
- Добавьте этикетку, чтобы вы могли вырваться из внешней петли из внутренней петли
Я также рекомендую использовать имена переменных так же, как и проблема, т.е. 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;
Отчасти, как иначе, все еще искали решения, хотя вы уже нашли его. Если вы не будете больше решений, то вам следует опустить заявление «Возвращение».