Titlul: Numarul de divizori primi ai uni numar
Scris de: Alex Anastasiu din Iulie 31, 2015, 10:45:11
Salut! As avea o mica problema. Am de aflat divizorii primi ai unui numar in c++ si nu imi dau seama cum sa fac. Iata la ce m-am gandit: fac ciurul pana la numar si aoi numar divizorii primi. Ma puteti ajuta,va rog?
Titlul: Răspuns: Numarul de divizori primi ai uni numar
Scris de: FMI Razvan Birisan din Iulie 31, 2015, 14:11:35
Ideea ta de rezolvare e bună. Nu înțeleg unde ai probleme. La implementare ? :-k Poți să rezolvi problema și fără ciur, depinde de cât de optimă vrei să fie rezolvarea. FARA CIUR:# include <stdio.h>
int main() { int numar,divizor,d,k,prim;
scanf("%d",&numar); k = 0; if( numar% 2 == 0 ) { printf("%d ",2); k = 1; } for( divizor = 3 ; divizor <= numar/2 ; divizor += 2 ) { // Incep de la 3. Niciun numar prim nu e par, cu exceptia lui 2. prim = 1; if( divizor%2 == 0 ) continue; // Daca divizor nu e prim, merg la urmatorul divizor posibil. for( d = 3 ; d <= divizor/2 ; d += 2 ) if( divizor%d == 0 ) { prim = 0; break; // Daca am aflat ca divizor nu e prim, ies din for } if( prim == 0 ) continue; // Daca divizor nu e prim, merg la urmatorul divizor posibil. if( numar%divizor == 0 ) { printf("%d ",divizor); k = 1; } } if( k == 0 ) puts("Numarul nu are divizori primi proprii.");
return 0; }
CIUR:# include <stdio.h> # define NMax 200001
int V[NMax];
void ciur() { int i,j;
for( i = 2 ; i <= NMax ; ++i ) for( j = i+i ; j <= NMax ; j +=i ) V[j] = 1; }
int main() { int i,numar,k;
k = 0; ciur(); scanf("%d",&numar); for( i = 2 ; i <= numar/2 ; ++i ) if( V[i] == 0 && numar%i == 0 ) { printf("%d ",i); k = 1; } if( k == 0 ) puts("Numarul nu are divizori primi proprii."); return 0; }
Dacă vrei să mai optimizezi....Ciurul lui Eratostene (http://www.infoarena.ro/ciurul-lui-eratostene)
Titlul: multumesc
Scris de: Alex Anastasiu din Iulie 31, 2015, 14:33:39
Multumesc frumos.
|