PDA

View Full Version : [C++] Cicli per incrementare le variabili


Federico870
08-10-2007, 16:37
Ciao a tutti, questo è il mio primo post su questo forum, spero di aver postato e bene e non aver postato una domanda eccessivamente frequente:mc: .

Sto realizzando un semplice programmino per generare dei numeri primi ma ho un problema dovuto alle mie scarsissime conoscenze di programmazione.
Dunque: ho una formula di 26 variabili che da come risultato un numero primo, la versione attuale del programma attirubisce un valore random alle variabili, io vorrei poter realizzare un programma che partendo da 1, fino ad un valore massimo stabilito dall'utente, esegua la formula con tutte le combinazioni possibili delle variabili.

Qualcuno è in grado di darmi un'idea di come strutturare i cicli per realizzarlo? tutte le idee che mi sono venute in mente non coprono tutte le combinazioni possibili, non mi serve il codice ma solo un'idea su come strutturarlo.


Grazie in anticipo, Federico.

andbin
08-10-2007, 16:51
io vorrei poter realizzare un programma che partendo da 1, fino ad un valore massimo stabilito dall'utente, esegua la formula con tutte le combinazioni possibili delle variabili.Linguaggio?

Comunque, parlando in generale, ci sono almeno 2 possibilità: fare N cicli annidati (dove N è il numero delle variabili, se devi avere 3 variabili farai 3 cicli annidati) oppure "linearizzare" la progressione usando la stessa logica dei sistemi di numerazione: parti con un array es. {1, 1, 1}, incrementi il primo valore 2..3..4...max dopodiché lo riporti al valore iniziale e incrementi il valore successivo e così via.

yorkeiser
08-10-2007, 16:53
Puoi fare degli inner loop del tipo


for (a = 1; i<MAX_VALORE; a++)
for (b = 1; i<MAX_VALORE; b++)
for (c = 1; i<MAX_VALORE; c++)
for [...]
numero_primo = formula(a,b,c,....)


Questi coprono tutto il range dei possibili valori che le tue variabili possono assumere. E' una palla da scrivere, probabilmente puoi far di meglio utilizzando degli elementi di un altro array al posto delle singole variabili a,b,c in modo da fare un "for di for"

Federico870
08-10-2007, 18:26
Dunque grazie per le risposte, il linguaggio sarebbe il pascal o il c++, agli array non ci avevo pensato ma mi sfugge una cosa sulla serie di cicli annidati: in questo modo copre tutte le combinazioni? non inizia ad aumentare prima l'ultima variabile e poi tutte le altre? ad esempio riuscirei a ottenere la combinazione a=3, b=1, c=4?

andbin
08-10-2007, 19:30
Dunque grazie per le risposte, il linguaggio sarebbe il pascal o il c++, agli array non ci avevo pensato ma mi sfugge una cosa sulla serie di cicli annidati: in questo modo copre tutte le combinazioni? non inizia ad aumentare prima l'ultima variabile e poi tutte le altre? ad esempio riuscirei a ottenere la combinazione a=3, b=1, c=4?Sì, copre tutte le combinazioni.
Faccio degli esempi in "C", con 3 variabili ognuna con valori da 1 a 10 compresi.

(A) Cicli annidati
int a, b, c;

for (a = 1; a <= 10; a++)
{
for (b = 1; b <= 10; b++)
{
for (c = 1; c <= 10; c++)
{
printf ("%d, %d, %d\n", a, b, c);
}
}
}


(B) Come "sistema di numerazione":
int n[3] = { 1, 1, 1 };
int carry, i;

do {
for (i = 0; i < 3; i++)
printf ("%d, ", n[i]);
printf ("\n");

carry = 1;
for (i = 2; i >= 0; i--)
{
if ((n[i] += carry) > 10)
n[i] = 1;
else
{
carry = 0;
break;
}
}
} while (!carry);
La soluzione più figa chiaramente è la B, perché non solo consente di evitare gli N cicli annidati (se avete 10 variabili, vedete quanto è bello fare 10 cicli annidati..... :fagiano: ), ma è più generica (potrebbe essere benissimo parametrizzata) e si presta molto bene ad essere implementata come una funzione che funge da "iteratore" e cioè che ritorna ogni volta la combinazione successiva. Il che, in certe situazioni, non è poco!

Federico870
09-10-2007, 10:07
Grazie mille per le risposte ora proverò a vedere cosa riesco a fare