In questo programma vengono rappresentate alcune funzioni di base per il calcolo combinatorio, in particolare:

  • Combinazioni semplici
  • Combinazioni con ripetizione
  • Anagrammi
  • K parti di un N Insieme

La spiegazione di cosa essi sono non rientra nelle finalità di questo articolo e si demanda a testi specializzati.

Segue il codice:

import javax.swing.*;

public class Comb {
  /* Metodo per il calcolo del fattoriale */
  public static long fattoriale ( long numero ) {
    long fattoriale = 1;
    for ( long i = numero; i > 0; i-- )
      fattoriale *= i;
    return fattoriale;
  }

  /* Metodo per il calcolo del pedice */
  public static long pedice ( long dominio, long codominio ) {
    long pedice = 1;
    for ( int i = 0; i < dominio; codominio--, i++ )
      pedice *= codominio;
    return pedice;
  }

  /* Metodo per il calcolo dell'elevazione a potenza */
  public static long elevato ( long numero, long esponente ) {
    long elevato = 1;
    for ( int i = 0; i < esponente; i++ )
      elevato *= numero;
    return elevato;
  }

  public static void main ( String args[] ) {
    int scelta = 0, codominio, dominio;
    String scelta2, nome, nome2 = "";
    char sn, k1, k2;
    long len, finale = 1, cont = 0;

    while ( scelta != 5 ) {
      scelta = Integer.parseInt(JOptionPane.showInputDialog("1) Combinazioni semplici\n2) Combinazioni con ripetizione\n3) Anagrammi\n4) K parti di un N insieme\n5) Uscire\nScegli cosa vuoi fare"));

      switch(scelta) {
        case 1:
          JOptionPane.showMessageDialog(null, "Questa relazione conta tutte le funzioni che possiamo avere da un k-insieme a \nun n-insieme da un insieme di partenza costituito da n-elementi distinti, \nvoglio costruire le distribuzioni a k a k senza reinserimento di questi elementi\nFormula: Codominio pedice Dominio");
          codominio = Integer.parseInt(JOptionPane.showInputDialog("Scrivi il codominio"));
          dominio = Integer.parseInt(JOptionPane.showInputDialog("Scrivi il dominio"));
          JOptionPane.showMessageDialog(null, "Il risultato e': " + pedice(dominio, codominio));
          break;
        case 2:
          JOptionPane.showMessageDialog(null, "Questa relazione conta tutte le funzioni che possiamo avere da un k-insieme a \nun n-insieme da un insieme di partenza costituito da n-elementi distinti, \nvoglio costruire le distribuzioni a k a k con ripetizioni di questi elementi\nFormula: Codominio elevato Dominio");
          codominio = Integer.parseInt(JOptionPane.showInputDialog("Scrivi il codominio"));
          dominio = Integer.parseInt(JOptionPane.showInputDialog("Scrivi il dominio"));
          JOptionPane.showMessageDialog(null, "Il risultato e': " + elevato(codominio, dominio));
          break;
        case 3:
          JOptionPane.showMessageDialog(null, "Questa funzione conta tutte le possibilita' che abbiamo di avere parole distinte (senza reinserimento) o anche in cui si ripetono le lettere\nuguali nella stessa posizione (con reinserimento)\nFormula con reinserimento: Fattoriale della cardinalita' della parola, |Parola|!\nFormula senza reinserimento: Fattoriale della cardinalita' della parola diviso il fattoriale delle lettere che si ripetono,\n (|Parola|)! : (Lettere che si ripetono)!");
          scelta2 = JOptionPane.showInputDialog(null, "Vuoi con ripetizione? (s/n)");
          sn = scelta2.charAt(0);
          switch(sn) {
            case 's':
              nome = JOptionPane.showInputDialog("Scrivi nome da anagrammare");
              JOptionPane.showMessageDialog(null, "Le possibilita' con ripetizione sono: " + fattoriale(nome.length()));
              break;
            case 'n':
              nome = JOptionPane.showInputDialog("Scrivi nome da anagrammare");
              len = nome.length();
              /* Questo ciclo calcola quante volte le singole lettere si ripetono nel nome. 
               * Una lettera gia' contata in un ciclo non viene piu' contata in quello successivo
               * perche' viene sostituita con un *.
               */

               for ( int i = 0; i < len; i++ ) {
                 k1 = nome.charAt(i);
                 if ( k1 != '*' ) {
                   for ( int j = 0; j < len; j++ ) {
                     k2 = nome.charAt(j);
                     if ( k1 == k2 ) {
                       cont++;
                       nome2 += '*';
                     }
                     else
                       nome2 += k2;
                   }
                   finale *= fattoriale(cont);

                   cont = 0;
                   nome = nome2;
                   nome2 = "";
                 }
               }

               JOptionPane.showMessageDialog(null, "Le possibilita' senza ripetizione sono: " + fattoriale(len) / finale);
               finale = 1;
               break;
             default: JOptionPane.showMessageDialog(null, "Scelta non possibile");               
          }
          break;
        case 4:
          codominio = Integer.parseInt(JOptionPane.showInputDialog("Scrivi il codominio"));
          dominio = Integer.parseInt(JOptionPane.showInputDialog("Scrivi il dominio"));
          JOptionPane.showMessageDialog(null, "Il risultato e': " + ( pedice(dominio, codominio) / fattoriale(dominio) ));
          break;
        case 5: JOptionPane.showMessageDialog(null, "Programma terminato"); break;
        default: JOptionPane.showMessageDialog(null, "Scelta non possibile" ); break;
      }   
    }    
  }
}