|
|
|
![]() |
|
Strumenti |
![]() |
#21 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Il continue lì non va messo...anzi, ci va messo un break... Infatti se hai trovato un divisore diverso dal numero stesso e da 1 il numero non è primo
![]() |
![]() |
![]() |
![]() |
#22 | |
Member
Iscritto dal: May 2003
Messaggi: 119
|
Quote:
Il codice di n0ps però era un po' diverso e mostrava a video tutti i fattori primi di un numero. In tal caso il continue serve per ridividere il numero da testare ancora per il numero di test. Ad esempio 12 è divisibile 2 volte x 2, il continue serve appunto a far sì che la divisione venga fatta 2 volte |
|
![]() |
![]() |
![]() |
#23 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Comunque diciamo che il programma si può semplificare molto...
Ad esempio è inutile dividere il numero da testare per i multipli di 2 (in teoria sarebbe inutile dividerlo per i multipli di tutti i numeri già testati)... Ad esempio questo è già più semplice, anche da capire... Codice:
int isprime(int n) { int i; int lim = (int)sqrt(n); if((n % 2) == 0) return 0; for(i=3; i <= lim; i+=2) if((n % i) == 0) return 0; return 1; } Ultima modifica di cionci : 29-06-2005 alle 12:49. |
![]() |
![]() |
![]() |
#24 |
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
E quello che avevo fatto io (parlo sempre della funzione isprime() non di quella per trovare fattori primi quella è un'altra) va bene lo stesso?
Codice:
int isprime(){ int k; for (k=2; k<n; k++){ while(n%k!=0){ continue; } return 1; } return 0; } Cmq cionci del tuo programma non ho capito perché consideri la radice quadrata del numero n per vedere se quello è primo o no. Scusa ma in matematica non brillo moltissimo ![]() |
![]() |
![]() |
![]() |
#25 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Quindi il numero può avere benissimo divisori maggiori di q, ma la ricerca fino a q proverebbe già che il numero non è primo... |
|
![]() |
![]() |
![]() |
#26 |
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
Ok grazie vedrò di rifletterci su!
![]() E per quanto riguarda la mia funzione che ho postato, potrebbe essere un'altra soluzione? |
![]() |
![]() |
![]() |
#27 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Perchè metti un while ? Basta un if... Anzi in questo modo ti si pianta perchè con continue torna al while....
|
![]() |
![]() |
![]() |
#28 |
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
![]() ![]() ![]() |
![]() |
![]() |
![]() |
#29 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Sì, va bene che arrivi a due...
Per farti un esempio: 54 è divisibile per 27, 18, 9, 6, 3, 2... 54 = 27 * 2 54 = 18 * 3 54 = 9 * 6 54 = sqrt(54) * sqrt(54) La radice quadrata (arrotondata) di 54 è 7... Come vedi arrivando fino a 7 escluderemmo comunque tutte i divisori di 54 (anche se si ferma subito a 2)... Come vedi se c'è un fattore maggiore di sqrt(54), l'altro è minore di sqrt(54)...quindi testando solo quelli minori o uguali a sqrt(54) escludi automaticamente anche i fattori maggiori di sqrt(54)... |
![]() |
![]() |
![]() |
#30 |
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
Ok e quindi una volta che considero solo i fattori minori della radice chi mi garantisce la primalità del numero? Se avessi considerato tutti i fattori non lo potrei trovare ugualmente? O forse in termini di prestazioni è conveniente usare questo qui?
|
![]() |
![]() |
![]() |
#31 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Chiaro che in termini di prestazioni è più veloce, ma anche in termini di qualità... Diciamo che fa più effetto
![]() |
![]() |
![]() |
![]() |
#32 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
![]() |
![]() |
![]() |
#33 | |
Bannato
Iscritto dal: Feb 2003
Messaggi: 947
|
Quote:
Codice:
#include <stdio.h> void main(void) { unsigned long num,i; printf("Numero da fattorizzare: "); scanf("%9ld",&num); printf("\n%ld=",num); for(i=2;i*i<=num;i+=num%i?(i&1)+1:2-i) { if(num%i==0) { printf("%ld*",i); num/=i; } } printf("%ld\n",num); } Ultima modifica di repne scasb : 29-06-2005 alle 18:08. |
|
![]() |
![]() |
![]() |
#34 |
Junior Member
Iscritto dal: Apr 2011
Messaggi: 2
|
Spiegazioni
Potresti cercare di spiegarmi la sintassi della riga for
for(i=2;i*i<=num;i+=num%i?(i&1)+1:2-i) Grazie |
![]() |
![]() |
![]() |
#35 | |
Member
Iscritto dal: Aug 2005
Messaggi: 168
|
Quote:
Codice:
for(i=2 ; i*i<=num ; i+=num%i ? (i&1)+1 : 2-i) Codice:
if(num%i) i+=(i&1)+1 else i+=2-i |
|
![]() |
![]() |
![]() |
#36 |
Junior Member
Iscritto dal: Apr 2011
Messaggi: 2
|
Chiarissimo , ti ringrazio, visto che sei così bravo, avrei bisogno, per uno studio che sto facendo, come si fa a poter rappresentare la scomposizione di un numero in fattori primi con la dicitura es. 16 =2^4 , 6= 2^1*3^1 etc.
Grazie anticipatamente |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:15.