| HOME | FORUM | INDICE |

ContenitoreNumeri.java

/*
    Classe che determina i Numeri Primi in base all'algoritmo di Eratostene.
    Fornisce inoltre un metodo statico per il calcolo del fattoriale e della serie di Fibonacci.

    Autore: Agosto 2009, Giovanni Iacobelli - http://www.iacosoft.com

*/


class ContenitoreNumeri
{
    int limite= 0;
    int Num[];
    boolean Primi[];
    boolean Calcolo= false;

    //costruttore
    public ContenitoreNumeri(int max)
    {
        //inizializza i vettori
        Num= new int[max];
        Primi= new boolean[max];

        for(int x= 0; x < max; x++)
        {
            Num[x]= x+1;
            Primi[x]= true;

        }

        limite= max;
    }

    //determina i numeri primi
    public void CalcolaValoriPrimi()
    {
        /*
            l'algoritmo consiste nell'escludere tutti i multipli
            dei numeri (da 2 fino al limite massimo impostato)
        */

        for(int x= 1; x < limite; x++)
        {
            if (Primi[x])
            {
                for(int y= 2; (y * Num[x] ) <= limite; y++)
                {
                    Primi[(y * Num[x]) -1] = false;
                }
            }
        }
        Calcolo= true;
    }

    /*
        restituisce il conteggio dei numeri primi trovati
    */

    public int CountNumeriPrimi()
    {

        if (!Calcolo)
        {
            CalcolaValoriPrimi();
        }

        int tot= 0;
        for(int x= 0; x < limite; x++)
        {
            if (Primi[x])
            {
                tot++;
            }
        }

        return tot;
    }

    /*
        restituisce un array di int contenente i numeri primi
        determinati dall'elaborazione
    */

    public int[] GetNumeriPrimi()
    {
        int tot= CountNumeriPrimi();
        int[] ris= new int[tot];

        int ind= 0;
        for(int x= 0; x < limite; x++)
        {
            if (Primi[x])
            {
                //System.out.println(Num[x]);
                ris[ind++]= Num[x];
            }
        }

        return ris;
    }

    //restituisce il fattoriale di un numero
    public static int GetFattoriale(int num)
    {
        if (num > 0)
        {
            //usa la ricorsione
            return num * GetFattoriale(num-1);
        }

        return 1;
    }


    //ritorna una array di dimensione num contenente la serie di Fibonacci
    public static int[] GetSerieFibonacci(int num)
        throws ArgomentoNonValido
    {
        
        /*
            la serie di Fibonacci è una serie numerica dove i numeri sono
            dati dalla sommatoria dei due numeri precedenti:

            1 1 2 3 5 8 ..
        */

        int[] ris= new int[num];
        
        if (num > 1)
        {
            ris[0]=1;
            ris[1]=1;
        
            for(int x= 2; x < num; x++)
            {
                ris[x]= ris[x-1] + ris[x-2];
            }

        } else
            throw new ArgomentoNonValido(); //genera l'eccezione personalizzata
        
        return ris;
    }
}