Originariamente inviato da maiosyet
Grazie a tutti

Prendo il source di Null come base perchè è in C semplice...da buon fagiano partono le domandone di chiarimento

1) Ho sostituito l'assegnamento random di "numero"
codice:
srand ( (unsigned) time ( NULL ) );
int numero = rand ( ) % 10000;
Con un semplice valore per scanf
codice:
int numero;
scanf ("%d", &numero);
Ma i risultati (cambiando solo quello) lasciano perplessi...perchè!?
codice:
[maiosyet]@[alcibiade]-[~/Sorci/Fattori] ./Prova.bin
Inserire numero da fattorizzare
999
999 (1206604416) e' divisibile per 2 (resta 603302208).
999 (603302208) e' divisibile per 2 (resta 301651104).
999 (301651104) e' divisibile per 2 (resta 150825552).
999 (150825552) e' divisibile per 2 (resta 75412776).
999 (75412776) e' divisibile per 2 (resta 37706388).
999 (37706388) e' divisibile per 2 (resta 18853194).
999 (18853194) e' divisibile per 2 (resta 9426597).
999 (9426597) e' divisibile per 3 (resta 3142199).
999 (3142199) e' divisibile per 41 (resta 76639).
999 (76639) e' divisibile per 173 (resta 443).
999 (443) e' divisibile per 443 (resta 1).
[maiosyet]@[alcibiade]-[~/Sorci/Fattori]
Fa tutto sto casino, ma conclude sempre con 443, qualsiasi numero io gli dia...
Semplicemente perche'
codice:
n_attuale = numero;
Viene dato prima che numero abbia il suo valore finale...

Sostituisci cosi' il pezzo della dichiarazione delle vars:
codice:
	int numero;
	int n_attuale;
	int i;
	
	scanf ( "%d", &numero );
	n_attuale = numero;
E' solo questione d'esperienza: presto ti ci abituerai a queste stranezze del C











Poi ci sono alcune parti di codice che non ho capito

codice:
if ( ! ( n_attuale % i ) ) {
Questo pezzo dice: Se il resto di n_attuale / i è diverso da...? Da cosa?
Quel pezzo dice: se i e' divisore di n_attuale...
Per l'esattezza l'operatore modulo ( % ) da il resto della divisione tra i due operandi... Se il resto e' 0 ovviamente significa che il primo e' multiplo del secondo...

Il punto esclamativo davanti e' il segno di negazione... Inverte la condizione: se e' vera la rende falsa, e se e' falsa la rende vera...
Nel C (come in quasi tutti gli altri linguaggi, fa eccezione -che io sappia- solo la bash ) lo 0 significa falso, mentre un valore diverso da 0 significa vero...
Se il resto della divisione tra n_attuale & i ( n_attuale % i ) e' 0 la condizione risulta quindi falsa... Ponendoci un ! davanti viene trasformata in vera, mentre in tutti gli altri casi viene trasformata in falsa e non viene eseguita...

In pratica quella riga e' identica a questa:
codice:
if ( ( n_attuale % i ) == 0 ) {










E poi
codice:
n_attuale /= i;
continue;
Questa istruzione è come dire
codice:
n_attuale = n_attuale / i
?
Esatto
Assegna a n_attuale il risultato della sua divisione con i...
codice:
( a += b ) == ( a = a + b)
( a -= b ) == ( a = a - b)
( a *= b ) == ( a = a * b)
( a /= b ) == ( a = a / b)
( a %= b ) == ( a = a % b)
Queste abbreviazioni (come anche usare il "!" invece che mettere "== 0") sono comode perche' abbreviano il tempo di scrittura del codice, e quando sai cosa scrivere sono splendidamente comode










Ultima cosa: al posto che un valore sentinella per uscire dal ciclo, hai messo continue...ma come funziona? :master:

Grazie
Il continue fa tornare immediatamente a capo del ciclo, non lo fa terminare...
Ho usato il continue perche' quando trovo un valore per i che lo rende divisore di n_attuale devo riciclare senza incrementare i, dato che lo stesso numero puo' essere piu' volte divisore...
Se avessi tolto il continue ed avessi lasciato continuare l'esecuzione del ciclo i sarebbe stata incrementata e con alcuni numeri cio' puo' provocare problemi...
Prova a levare quel continue e ad inserire come numero "4"...
Invece che usare quel continue avrei potuto altrimenti metterci un "i--;"... Prova a sostituirlo e vedrai che non cambia nulla...