Esercizio "Trova tutte le combinazioni di 3 numeri che, sommati, danno n"

di il
3 risposte

Esercizio "Trova tutte le combinazioni di 3 numeri che, sommati, danno n"

La traccia dell'esercizio é:
"Dato un numero N, trova tutte le combinazioni di 3 numeri che, sommati, danno N. Suggerimento: usa 3 cicli for annidati".

Ho scritto un codice che funziona:

// Legge un intero positivo n e trova tutte le combinazioni di
// tre numeri la cui somma da' n

#include <stdio.h>

int main(void)
{
	// n e' la somma dei tre numeri; a, b e x sono i tre numeri che, sommati,
	// danno n; tot e' il numero totale delle combinazioni trovate
	int n, a, b, x, tot = 0;
	
	printf("Digita un intero positivo: ");
	scanf("%d", &n);
	
	for (a = 0; a <= n; ++a) 
	{
		b = 0;
		for (b = 0; b <= n; ++b)
		{
			x = n - a - b;
			if (x < 0) { break;}
			++tot;
			printf("%d = %d + %d + %d\n", n, a, b, x);
		}
	}
	
	printf("\nLe combinazioni sono: %d", tot);
	return 0;
}
Ma il mio codice trova anche le combinazioni equivalenti (ad esempio 3 = 0 + 1 + 2 e 3 = 2 + 1 + 0) come potete vedere da questo esempio di output:

Digita un intero positivo: 3
3 = 0 + 0 + 3
3 = 0 + 1 + 2
3 = 0 + 2 + 1
3 = 0 + 3 + 0
3 = 1 + 0 + 2
3 = 1 + 1 + 1
3 = 1 + 2 + 0
3 = 2 + 0 + 1
3 = 2 + 1 + 0
3 = 3 + 0 + 0

Le combinazioni sono: 10
Come potrei migliorare il mio codice per eliminare le ripetizioni (senza usare array che non ho ancora studiato)?
Tra l'altro la traccia dell'esercizio consigliava di usare 3 cicli for annidati, io ne ho usati solo due il ché mi sembra strano...

3 Risposte

  • Re: Esercizio "Trova tutte le combinazioni di 3 numeri che, sommati, danno n"

    L'uso di 2 cicli invece di tre e' gia' un miglioramento.
    COMUNQUE fallo anche con 3, SEMBRA stupido ma non lo e': in particolare, stampa anche i casi non validi

    Un'altro modo e' utilizzare la proprieta' commutativa dell'addizione:

    a+b+c = c+b+a =...

    come sai, ci sono BEN 3!=6 modi diversi di ordinare i valori a, b, c.
    Quindi non serve avere tutti i modi, ne basta 1.

    Come ultimo passo, trova quale metodo e' il piu' efficiente.
  • Re: Esercizio "Trova tutte le combinazioni di 3 numeri che, sommati, danno n"

    Grazie migliorabile,
    seguiró i tuoi ottimi consigli
  • Re: Esercizio "Trova tutte le combinazioni di 3 numeri che, sommati, danno n"

    migliorabile ha scritto:


    L'uso di 2 cicli invece di tre e' gia' un miglioramento.
    COMUNQUE fallo anche con 3, SEMBRA stupido ma non lo e': in particolare, stampa anche i casi non validi

    Un'altro modo e' utilizzare la proprieta' commutativa dell'addizione:

    a+b+c = c+b+a =...

    come sai, ci sono BEN 3!=6 modi diversi di ordinare i valori a, b, c.
    Quindi non serve avere tutti i modi, ne basta 1.

    Come ultimo passo, trova quale metodo e' il piu' efficiente.
    Ce l'ho fatta!!!
    Il codice finale trova tutte le combinazioni di 3 numeri senza creare ripetizioni e senza usare vettori
    Ho usato due cicli for e due if:
    
    /* Legge un intero positivo n e trova tutte le combinazioni di
     * tre numeri la cui somma da' n, eliminando le ripetizioni.
     */
    
    #include <stdio.h>
    
    int main(void)
    {
    	int n, q = 0, limite = 0, a, x, y = 0, z = 0;
    	
    	printf("Inserisci un numero intero positivo: ");
    	scanf("%d", &n);
    	
    	// troviamo il limite del primo termine
    	if (n % 3 == 0)
    	{ q = 0;
    		} else { q = 1; }
    	limite = n / 3 + q;
    	
    	// nel primo ciclo troviamo il primo termine
    	for (a = 0; n - a >= limite; ++a)
    	{
    		x = n - a;
    		
    		// nel secondo ciclo troviamo il secondo e terzo termine
    		for (y = (n-x), z = 0; z <= y; --y, ++z)
    		{
    			if (y <= x) {
    			printf("\n%d = %d + %d + %d", x + y + z, x, y, z); }
    		}
    			
    	}
    		
    	return 0;
    }
    
    
    Scusate l'esultanza per un programmino cosí semplice ma per me é un piccolo traguardo
    Grazie ancora migliorabile!
Devi accedere o registrarti per scrivere nel forum
3 risposte