Realizzare un piccolo programma

di il
5 risposte

Realizzare un piccolo programma

Salve,
ho bisogno di un software che mi calcoli tutti gli i modi possibili che mi diano una determinata somma in n addendi.
ESEMPIO la somma deve essere 34 in 4 addendi: 10+10+10+4 = 34
10+10+12+2 = 34
9+3+20+2 = 34
............... = 34 etc..

Gli addendi vanno da 3 a 7 mentre la somma da 17 a 135
I numeri devono essere interi e lo zero non esiste!
Chi è disposto a realizzare questo piccolo programma gratuitamente gliene sarei molto grato e apprezzerei la sua gentilezza.
Sarei cmq disposto a pagare magari tramite una ricarica telefonica per chi lo realizzasse in tempi brevi. Spero di essermi spiegato bene e di aver scelto la sezione giusta. Potete anche rispondermi qui. Vi lascio comunque il mio indirizzo di posta elettronica:

5 Risposte

  • Re: Realizzare un piccolo programma

    Ciao.
    Hai detto che possono essere tra 3 e 7, ma nella somma quanti devono essere ? 5 ?
    Saluti.
  • Re: Realizzare un piccolo programma

    Salve Luky, grazie per avermi risposto.
    Non ho capito, cosa intende dire che nella somma devono essere 5?
    Cmq ho dato delle informazioni sbagliate. Scusate mi correggo:
    Gli addendi vanno da 3 a 6 e più specificamente la somma deve dare questi numeri: 17,23,34,68,90,135. Ognuno di questi numeri deve essere scomposto prima in 3, poi in 4, poi in 5, e poi in 6 addendi IN TUTTE LE SCOMPOSIZIONI POSSIBILI.
    Avevo scritto un numero compreso tra 17 e 135 perchè credo che basti una "formula" nella quale io inserisco N addendi e X somma e come risultato ho la scomposizione della somma in N addendi IN TUTTI I MODI POSSIBILI.
    Faccio un altro esempio per chiarimento; la somma deve essere 17 in 5 addendi.Come risultato dovrò avere tutte le scomposizioni possibili della somma 17 in 5 addendi:
    10+2+1+3+1 = 17
    10+2+1+1+3 = 17 le scomposizioni devono comprendere anche gli stessi addendi scambiati di posto!!
    10+1+2+1+3 = 17
    5+5+4+2+1 = 17
    3+1+8+2+3 = 17 etc..

    Sò che è un'operazione che si può fare anche manualmente ma è molto dispendiosa di tempo, per questo mi serve un programma che lo faccia al posto mio.
    Spero di aver tolto ogni dubbio.

    Grazie!
  • Re: Realizzare un piccolo programma

    Ciao Ervilla

    Il problema è un problema di calcolo delle 'combinazioni con ripetizione', se cerchi questa parola in internet troverai un mucchio di informazioni. Anche se la tua richiesta di escludere gli zeri cambia un pochino le cose.

    Comunque il tutto si risolve in poche righe.
    Questa è la versione che calcola anche gli zeri:
    
           void Scomponi(string s, int somma, int addendi)
            {
                for (int i = 0; i <= somma; ++i)
                {
                    string z = s + " " + (somma - i);
                    if (addendi == 1)
                    {
                        Print(z);
                        return;
                    }
                    Scomponi(z, i, addendi - 1);
                }
            }
    
    
    richiamandola con 4 e 2 generera:

    4 0
    3 1
    2 2
    1 3
    0 4

    Questa è la versione che esclude gli zeri (cambia solo un '+1'):
    
           void Scomponi(string s, int somma, int addendi)
            {
                for (int i = 0; i <= somma; ++i)
                {
                    string z = s + " " + (somma - i + 1);
                    if (addendi == 1)
                    {
                        Print(z);
                        return;
                    }
                    Scomponi(z, i, addendi - 1);
                }
            }
    
    
    Va richiamata sottraendo alla somma il numero di addendi.
    Ad esempio:
    
      somma = 10;
      addendi = 3;
    
      somma = somma - addendi
      Scomponi("", somma, addendi);
    
    Usando 4 e 2 generera:

    3 1
    2 2
    1 3

    Usando 5 e 3 genera:

    3 1 1
    2 2 1
    2 1 2
    1 3 1
    1 2 2
    1 1 3

    Usando 7 e 6 genera:

    2 1 1 1 1 1
    1 2 1 1 1 1
    1 1 2 1 1 1
    1 1 1 2 1 1
    1 1 1 1 2 1
    1 1 1 1 1 2

    Usando 10 e 10 genera:

    1 1 1 1 1 1 1 1 1 1

    Queste informazioni dovrebbero bastarti a scriverti il programma, se non sei in grado di farlo posso darti una mano.
    Una curiosità a cosa ti serve un programma del genere?
  • Re: Realizzare un piccolo programma

    Ti ringrazio moltissimo Barba59 per tutte queste informazioni che mi hai dato, ma purtroppo io non sono un programmatore e non ne so assolutamente niente di come scrivere il programma in base alle info che gentilmente Lei mi ha dato.
    Per questo ho scritto che sarei comunque disposto a pagare a chi lo realizzasse. Se si riscontrano problemi a creare il programma che nelle scomposizioni esclude gli zeri andrebbe bene anche la versione che include gli zeri.

    Grazie mille!
  • Re: Realizzare un piccolo programma

    Ti ho inviato il programma. Vedrai che ha una semplice interfaccia in cui puoi impostare la somma e il numero di addendi.

    C' è però una questione da discutere. Il numero di combinazioni è dato dalla formula:

    Binomiale(somma + addendi - 1, addendi - 1)

    La formula binomiale(k,n) corrisponde a k!/(k!(n-k)! vedi .

    Dato che non vuoi considerare gli zeri devi poi fare somma = somma - addendi, se qualcosa non è chiaro te lo posso spiegare meglio, non è questo il punto di cui voglio parlare.

    Il fatto è che con i valori 5 e 3 (ad esempio) tutto e ok sono solo 6 combinazioni, ma con 23 e 6 cominciano i problemi perchè le combinazioni sono 26334, se poi consideri 135 e 6 le combinazioni diventano 333.859.526 non credo che tu le voglia esaminare tutte.

    Il programma scrive i risultati in un box per cui nel caso di questi numeri enormi non riuscirà a terminare (darà problemi di memoria ad un certo punto) per questo motivo ti ho messo un pulsante stop che interrompe l' eleborazione.

    La modifica al programma sarebbe semplice, basta scrivere su un file, non l' ho fatta perche immagino non ti serva, fammi sapere.
Devi accedere o registrarti per scrivere nel forum
5 risposte