View Full Version : C: numero primo
chi mi scrive un semplice algoritmo per vedere se un numero è primo oppure no?
Il piu famoso e anche semplice è il crivello di eratostene. http://it.wikipedia.org/wiki/Crivello_di_Eratostene
Se ti serve un esempio in qualche linguaggio basta chiedere.
ciao ;)
Il punto è che non mi serve per vedere se una serie di numeri è primi, ma voglio sapere dato n da input, dire se questo è primo. il linguaggio è C.
grAZIE
ilsensine
21-11-2006, 14:59
Il modo più semplice è controllare che non sia divisibile per nessuno dei numeri dispari da 3 alla radice quadrata del numero che stai controllando.
Non esistono algoritmi efficienti per risolvere questo problema.
per questa volta mi posteresti direttamente un algoritmo abbastanza buono per fare quello che ho detto?
icecube_HU
21-11-2006, 15:12
Il modo più semplice è controllare che non sia divisibile per nessuno dei numeri dispari da 3 alla radice quadrata del numero che stai controllando.
Non esistono algoritmi efficienti per risolvere questo problema.
Gia' ! :D
Per guadagnare un po' in efficienza, conviene sfruttare il fatto che tutti i numeri primi (tranne 2 e 3) sono della forma: 6*K +/- 1,
calcolando: r = N mod 6
Se r e' diverso da 1 o 5, il numero NON e' primo.
Poi si prosegue come hai indicato...
Ciao !
Vi sto chiedendo per favore di postarmi direttamente la codifica in C.
graZIE
te la saprei fare in pascal, ma non in C.. :muro:
Allora me la fai in pascal? poi traduco io. grazie tanto
dammi 10 min.. :D
dopo me lo posti tradotto così mi imparo un po' di C
icecube_HU
21-11-2006, 15:36
Vi sto chiedendo per favore di postarmi direttamente la codifica in C.
graZIE
Sorry, I don't speak C.
Pero' in VB o VBA e':
Function IsPrime(N As Long) As Boolean
Dim r As Long
If N <= 0 Then Err.Raise 5, "IsPrime", "Argomento errato !"
If N <= 3 Then
IsPrime = True
Else
r = N Mod 6
If r = 1 Or r = 5 Then
For r = 3 To Sqr(N) Step 2
If (N Mod r) = 0 Then Exit Function
Next
IsPrime = True
End If
End If
End Function
Non dovrebbe esserti troppo difficile tradurlo in C...
Ciao !
EDIT: come giustamente fatto notare, 1 NON E' primo !!
Basterebbe una piccola modifica alla routine, ma a questo punto conviene riscriverla col costrutto Select, piu' efficiente:
Public Function IsPrime(n As Long) As Boolean
Dim r As Long
Select Case n
Case Is < 0: Err.Raise 5, "IsPrime", "Argomento errato !"
Case 0, 1: 'niente, non sono primi
Case 2, 3: IsPrime = True
Case Else
r = n Mod 6
If r = 1 Or r = 5 Then
For r = 3 To Sqr(n) Step 2
If (n Mod r) = 0 Then Exit Function
Next
IsPrime = True
End If
End Select
End Function
avevo quasi finito in pascal, ma visto che ti è arrivata la soluzione in vb lascio quella che è fatta meglio ^^
una sola cosa. cosa vuol dire step 2, che incrementa di 2 il contatore?
icecube_HU
21-11-2006, 17:59
una sola cosa. cosa vuol dire step 2, che incrementa di 2 il contatore?
Si' ! :)
potresti incollare la tua traduzione in C? sono curioso di sapere come hai fatto a tradurre l'incremento di 2..
un altra cosa, cosa vuol dire err raise?
icecube_HU
22-11-2006, 08:39
potresti incollare la tua traduzione in C? sono curioso di sapere come hai fatto a tradurre l'incremento di 2..
un altra cosa, cosa vuol dire err raise?
Genera un errore "Invalid argument" se si calcola la funzione per valori negativi o uguali a zero, per i quali non e' definita.
Lo stesso che avviene, ad esempio, per la funzione standard Log().
potresti incollare la tua traduzione in C? sono curioso di sapere come hai fatto a tradurre l'incremento di 2..
i+=2 invece di i++ nel for...
Ziosilvio
22-11-2006, 11:22
voglio sapere dato n da input, dire se questo è primo
Vuoi sapere tu, o ti ha dato l'esercizio il prof?
int is_prime(int a){
long r;
if (a==0){
return 0;
}
if (a<=3){
return 1;
}
else {
r=a % 6;
if ((r==1) || (r==5)){
for (r=3;r<=sqrt(a);r=r+2){
if ((a % r) == 0){
return 1;
}
else {
return 0;
}
}
}
}
}
ritorna 1 se è primo, zero se non lo è.
Ziosilvio
22-11-2006, 14:34
int is_prime(int a){
Per cortesia: impara a usare il tag "code".
long r;
if (a==0){
return 0;
}
if (a<=3){
return 1;
}
else {
r=a % 6;
if ((r==1) || (r==5)){
for (r=3;r<=sqrt(a);r=r+2){
if ((a % r) == 0){
return 1;
}
else {
return 0;
}
}
}
}
}
ritorna 1 se è primo, zero se non lo è.
La funzione restituisce 1 se l'input è 1; e 1 non è un numero primo.
(Se 1 fosse primo, non sarebbe più vero che ogni intero positivo si scompone in prodotto di numeri primi in modo unico almeno dell'ordine, e questo proprio perché si può moltiplicare per 1 quante volte si vuole.)
Il test su a%6 è reso superfluo dal resto, e non rende significativamente più veloce il programma.
Inoltre, hai dimenticato di specificare la condizione di ritorno in questo caso. (Lo vedi subito dall'indentazione.)
La condizione r<=sqrt(a) equivale a r*r<=a, la quale ha il vantaggio di usare solo int.
I valori di ritorno del test su a%r sono scambiati: se a%r==0, allora a è divisibile per r.
Cosa ancora più grave: il "return 0" sta dentro il ciclo for, col risultato che questo viene eseguito una volta sola.
piccolo errore, nel if del ciclo for i ritorni vanno invertiti
int is_prime(int a){
/*gli viene passato il numero di fibonacci e dice se questo è o non è primo*/
long r;
if ((a==0)||(a==1)){
return 0;
}
if (a<=3){
return 1;
}
else {
r=a % 6;
if ((r==1) || (r==5)){
for (r=3;r<=sqrt(a);r=r+2){
if ((a % r) == 0){
return 0;
}
else {
return 1;
}
}
}
}
}
cosi va o no? se nn va mi posti quello giusto...please
i+=2 invece di i++ nel for...
si scusate... so usare solo il pascal dove mi sembra non sia possibile incrementare di 2 semplicemente come nel C
In pascal in tal caso mi sembra che si debba usare un ciclo diverso dal for...
Leggendo questa discussione mi e' venuto in mente una vecchia discussione, proprio sui numeri primi e crivello di eratostene, con diversi codici; pero' cercando con il search non la ho trovata. Non e' che qualcuno se la ricorda e magari ha il link?(se esiste ancora).
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.