Risolvere un'equazione difficile con due variabili in Java
-
27-10-2019 - |
Domanda
Il mio incarico dice di fare quanto segue:
Search2: cerca una soluzione a x*x + y*y - 12x -10y + 36 = 0. Cerca da 0 a 10 sia in xey, cercando ogni valore y prima di spostarsi al successivo x. Stampa le prime tre soluzioni trovate. (Nota: una pausa etichettata è utile qui!)
Non riesco a capire la logica per questo. Penso di dover usare più di 2 loop ma non sono sicuro.
Questo è quello che ho finora (si ripete solo (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 + ")");
}
}
}
AGGIORNARE
Ecco la soluzione:
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++;
}
}
}
Soluzione
Non è un brutto tentativo. Perché sei così vicino, ti mostrerò una soluzione funzionante. Fondamentalmente, devi fare tre cose:
- Modificare
while
aif
- Usa una variabile per contare il numero di volte in cui trovi la soluzione, quindi puoi fermarti a tre
- Aggiungi un'etichetta in modo da poter uscire dal ciclo esterno dall'interno interno
Ti consiglio anche di utilizzare i nomi delle variabili uguali al problema - cioè x
e y
- per chiarezza.
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;
}
}
}
Quando viene eseguito, questo codice produce:
(6, 0)
(3, 1)
(9, 1)
Ci scusiamo per averti alimentato i cucchiai, ma parte della lezione qui è un buon stile di codifica e pratica.
Altri suggerimenti
Stai usando un extra while
Loop che funziona indefinitamente.
while (((i * i) + (j * j) - (12 * i) - (10 * j) + 36) == 0) {
System.out.println("(" + i + ", " + j + ")");
}
La prima volta che questo valuta il vero - cioè quando raggiunge (6,0) - continuerà a funzionare perché i
e j
non sono modificati all'interno.
È necessario sostituirlo con un if
.
Dai un'occhiata al ciclo interno mentre hai. Una volta trovata la soluzione all'equazione, i
e j
non cambiare mai e la formula valuta sempre a 0
, risultando in un ciclo infinito.
Potrebbe anche essere saggio rinominare i
e j
a xey, per chiarezza. Sei principalmente sulla strada giusta però. Non dimenticare che devi solo stampare le prime tre soluzioni.
Non ti aiuterò molto dato che questo è un concetto piuttosto semplice, ma pensa a ciò che devi attraversare, potrebbe rendere più facile usare invece X e Y Instad di I o J. Anche la tua stampa solo (6,0) perché è esattamente quello che gli hai detto di fare con il ciclo while.
Un suggerimento, il tuo loop dovrebbe avere un'affermazione che interrompe la sua funzione, diciamo se x <4, se mai è maggiore o = a quanto continuerà fuori dal ciclo.
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;
}
}
}
}
}
}
Per molto tempo ho scritto alcuni compiti di quel tipo ... solo per divertimento :)
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;
}
}
}
È importata ricordare il return;
Parte come faresti altrimenti ancora cercato soluzioni anche se ne hai già trovato una. Se non sei più soluzioni, allora dovresti omettere l'affermazione di "return".