2013-10-23 16 views
6

Desidero che un algoritmo generi tutti i numeri possibili di N cifre, le cui cifre sono in ordine crescente.Algoritmo per generare tutti i possibili numeri a N con cui le cifre sono in ordine crescente

es: se N = 3, quindi possibili numeri sono: 012.123.234.246.567.259, perché:

...

etc

Come posso farlo?

ho sviluppato il seguente algoritmo, ma genera solo i numeri con cifre consecutive crescenti come 123.234.345.456.567, ecc .. Quindi, un grande insieme di numeri è perso.

private static void generate(int start,int n) 
{ 
    if((start+n)>9) 
     return; 
    else 
    { 
     for(int i=0;i<n;i++) 
      System.out.print(start+i); 

     System.out.println(); 
     generate(start+1,n); 
    } 
} 
+6

Provare a risolvere il problema con una serie di problemi minori. Ad esempio, è necessario generare numeri a 10 cifre. Riesci a ottenere il tuo set di risposta se hai già numeri a 9 cifre risolti? Che dire dei numeri a 5 cifre? –

risposta

5

Cercando di preservare la vostra idea originale:

private static void generate(int prefix, int start, int n) 
    { 
     if (n == 0) 
     { 
      System.out.print(prefix); 
      System.out.println(); 
     } 
     else 
     { 
      for(int i=start;i<10;i++) 
       generate(10*prefix+i, i+1, n-1); 
     } 
    } 
+0

Bello e semplice, ben fatto! – DDW

+0

'System.out.print (prefisso); System.out.println(); 'può essere semplicemente' System.out.println (prefisso); ' – BartoszKP

+0

@BartoszKP l'OP non ha menzionato alcun linguaggio di programmazione, quindi ho assunto solo uno pseudo codice. – Henrik

0

Da un angolo più dichiarativo l'algoritmo apparirebbe quasi come notazione matematica (in Haskell):

generate = toInt [[a,b,c] | a <- x, b <- x, c <- x, a < b, b < c] 
    where x = [0..9] 
     toInt = map (foldl (\n m -> 10*n + m) 0) 

dove map (foldl (\n m -> 10*n + m) 0) traduce solo un elenco di cifre su un numero intero e il resto è una sorta di auto-documentazione: prendi tre cifre mentre obbedisci a un determinato vincolo.

Problemi correlati