Semplicemente perche'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"
Con un semplice valore per scanfcodice:srand ( (unsigned) time ( NULL ) ); int numero = rand ( ) % 10000;
Ma i risultati (cambiando solo quello) lasciano perplessi...perchè!?codice:int numero; scanf ("%d", &numero);
Fa tutto sto casino, ma conclude sempre con 443, qualsiasi numero io gli dia...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]Viene dato prima che numero abbia il suo valore finale...codice:n_attuale = numero;
Sostituisci cosi' il pezzo della dichiarazione delle vars:E' solo questione d'esperienza: presto ti ci abituerai a queste stranezze del Ccodice:int numero; int n_attuale; int i; scanf ( "%d", &numero ); n_attuale = numero;
Quel pezzo dice: se i e' divisore di n_attuale...Poi ci sono alcune parti di codice che non ho capito
Questo pezzo dice: Se il resto di n_attuale / i è diverso da...? Da cosa?codice:if ( ! ( n_attuale % i ) ) {
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 ) {
EsattoE poiQuesta istruzione è come direcodice:n_attuale /= i; continue;
?codice:n_attuale = n_attuale / i
Assegna a n_attuale il risultato della sua divisione con i...
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 comodecodice:( 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)
Il continue fa tornare immediatamente a capo del ciclo, non lo fa terminare...Ultima cosa: al posto che un valore sentinella per uscire dal ciclo, hai messo continue...ma come funziona? :master:
Grazie![]()
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...
![]()




) lo 0 significa falso, mentre un valore diverso da 0 significa vero...
Rispondi quotando