2015-10-12 28 views
5

è il mio primo post in modo da DO stomp me se ho scritto qualcosa di stupido.Elenco dei divisori di un numero

Ho appena iniziato classi IT, e oggi su "mentre" loop classe il mio tutor ci ha dato il seguente lavoro:

Scrivere un programma che legge un numero n e visualizza naturale in una scatola grafica all i suoi divisori dall'intervallo [2; n-1].

Finora mi si avvicinò con un codice che funziona, ma il risultato è un torto po ':

import java.util.Arrays; 
import javax.swing.JOptionPane; 

public class Divisors { 
    public static void main(String[] args) { 
     String n = JOptionPane.showInputDialog(null, "Enter a natural number"); 
     Integer i = Integer.parseInt(n); 

     int d = i - 1; 
     int x = 2; 
     int[] dvr = new int[i]; // [i] because bigger numbers need more iterations 

     while (x >= 2 && x <= d) { 
      double y = i % x; 

      if (y == 0) { 
       dvr[x] = x; 
       x = x + 1; 
      } else { 
       x = x + 1; 
      } 
     } 

     JOptionPane.showMessageDialog(null, "The divisors of " + i + " are:\n" + Arrays.toString(dvr)); 
    } 
} 

Il problema è che il ciclo si riempie la matrice con un sacco di zeri, e lo screenshot i risultati del tutor mostrano una finestra che elenca solo i divisori.

Ho provato a farlo con ArrayList, ma questa è magia nera per me in questo momento e il mio tutor non ci ha ancora insegnato come utilizzare qualsiasi cosa, al di là delle cose usate nel mio codice.

Qualsiasi aiuto molto apprezzato.

+2

In realtà, l'array è inizializzato a tutti gli zeri al momento della creazione, il ciclo non si sta riempiendo in su con gli zeri . – azurefrog

+1

Il tuo problema è con dvr [x] = x; Non vuoi impostare il valore del divisore alla posizione x. È necessaria una seconda variabile da indicizzare nell'array che si incrementa solo dopo ogni divisore aggiunto. – bhspencer

+0

@bhspencer ma ho ancora un numero predeterminato di slot nell'array – Shamanix

risposta

4

Il problema principale che stai avendo è che si sta andando ad avere un numero imprecisato di valori che si desidera stampare, ma si sta utilizzando una matrice per memorizzarli e gli array hanno una dimensione fissa. Dato che hai un array di int, sarà completamente popolato con il valore predefinito di zero.

Idealmente, si stampa solo il primo gruppo di valori diversi da zero dell'array, ma si memorizzano i divisori sparsi nell'array.

dvr[x] = x; memorizza ogni valore su un indice di quel valore, quando in realtà dovresti semplicemente memorizzare ogni nuovo valore nel prossimo punto aperto dell'array.

creare una variabile indice separato, e memorizzare ogni valore utilizzando invece:

int index = 0; 
    while (x >= 2 && x <= d) { 
    ... 
     if (y == 0) { 
      dvr[index++] = x; 
    ... 

Poi quando il ciclo principale è fatto, è possibile creare una nuova "serie visualizzazione" che contiene solo i divisori, e non gli zeri.A questo punto, index ti dice esattamente quanto grande deve essere:

int[] display = Arrays.copyOf(dvr, index); 
    JOptionPane.showMessageDialog(null, "The divisors of " + i + " are:\n" + Arrays.toString(display)); 
+0

Grazie mille! Questa è una spiegazione perfetta. – Shamanix

3

In Java il valore predefinito di un numero intero è zero. Ecco perché vedi molti zeri.

Poiché si definisce la dimensione dell'array su i che è superiore a quanto richiesto in quanto il numero di divisori sarebbe sempre inferiore a i.

Quindi invece di stampare l'intero array, è necessario stamparlo solo sul numero totale di divisori per il quale si dovrebbe utilizzare una variabile separata invece di utilizzare x.

Questa è la versione modificata in cui sto utilizzando una variabile index separata per tenere traccia del numero di divisori che iniziano da 0. Alla fine si può semplicemente stampare la matrice fino al index

import java.util.Arrays; 
import javax.swing.JOptionPane; 

public class Divisors { 
public static void main(String[] args) { 
    String n = JOptionPane.showInputDialog(null, "Enter a natural number"); 
    Integer i = Integer.parseInt(n); 

    int d = i - 1; 
    int index = 0; 
    int x=2; 
    int[] dvr = new int[i]; // [i] because bigger numbers need more iterations 

    while (x >= 2 && x <= d) { 
     double y = i % x; 

     if (y == 0) { 
      dvr[index] = x; 
      x = x + 1; 
      index= index + 1; 
     } else { 
      x = x + 1; 
     } 
    } 

    JOptionPane.showMessageDialog(null, "The divisors of " + i + " are:\n" + Arrays.copyOfRange(drv, 0, index)); 
} 
} 
+0

Il problema è, la variabile x viene anche incrementata se il controllo delle condizioni del divisore non è riuscito (si veda la parte). Quindi x, in realtà non rappresenterebbe il numero di divisori. – Ish

+0

sì risolto il problema. – pgiitu

+1

Dovrebbe dire: il valore predefinito di un 'int' è zero. –

1

Set datastructure evita i duplicati, è possibile utilizzare che per superare il problema dei divisori duplicati ottenere aggiunto nella struttura dati.

import java.util.*; 
    import javax.swing.JOptionPane; 

    public class Divisors { 
     public static void main(String[] args) { 
      String n = JOptionPane.showInputDialog(null, "Enter a natural number"); 
      Integer i = Integer.parseInt(n); 

      int d = i - 1; 
      int x = 2; 
      Set<Integer> divisors = new HashSet<>(); 

      while (x >= 2 && x <= d) { 
       double y = i % x; 

       if (y == 0) { 
        divisors.add(x); 
        x = x + 1; 
       } else { 
        x = x + 1; 
       } 
      } 

      List<Integer> l = new ArrayList<>(divisors); 
      JOptionPane.showMessageDialog(null, "The divisors of " + i + " are:\n" + l); 
     } 
    } 
+1

Sembra che OP non voglia una soluzione List o ArrayList perché questo va oltre lo scopo della classe OP. Inoltre, questa risposta non fornisce alcuna spiegazione con il codice. –

+0

OP non vuole il suo problema, non che possa progredire senza entrare in List o ArrayList o Set o in nessuna delle Classi di raccolta. Spiegazione, sì, fornirò. –

+0

@deepakmarathe Non è che non lo voglio, il mio tutor controlla il nostro codice e ha già colpito alcune persone per l'utilizzo di strumenti che non ha menzionato. So che è male ma è meglio di niente ... – Shamanix

1

Utilizzare ArrayList per creare l'array dinamico.
Below Code ti aiuterà.
Cose da cambiare nel programma.

  1. import java.util. *;
  2. prendere un varible ArrayList
  3. chiamata di metodo toString in oggetto Arraylist
import java.util.*; 
import javax.swing.JOptionPane; 

public class NewClass3 { 
    public static void main(String[] args) { 
     String n = JOptionPane.showInputDialog(null, "Enter a natural number"); 
     Integer i = Integer.parseInt(n); 

     int d = i - 1; 
     int x = 2; 
     List<Integer> dvr = new ArrayList<>(); 
     while (x >= 2 && x <= d) { 
      double y = i % x; 

      if (y == 0) { 
       dvr.add(x); 
       x=x+1; 
      } else { 
       x = x + 1; 
      } 
     } 

     JOptionPane.showMessageDialog(null, "The divisors of " + i + " are:\n" + dvr.toString()); 
    } 
}