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++;
            }
        }
    }
È stato utile?

Soluzione

Non è un brutto tentativo. Perché sei così vicino, ti mostrerò una soluzione funzionante. Fondamentalmente, devi fare tre cose:

  1. Modificare while a if
  2. Usa una variabile per contare il numero di volte in cui trovi la soluzione, quindi puoi fermarti a tre
  3. 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".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top