[VISUAL BASIC 2005] CALCOLO NUMERI PRIMI

martedì 03 giugno 2008 - 17.02

platino Profilo | Junior Member

Salve a tutti.
Considerando la regola secondo cui un numero si definisce "primo" quando nessuno dei numeri compresi tra 0
e la metà del numero è un suo divisore, come posso fare in modo che inserendo un "x" numero di valori da
calcolare, mi calcoli x numeri primi partendo da zero?
Ho pensato con un ciclo do until ma non mi viene un'idea per il codice......

Grazie mille per le risposte



_____platino_____
Visitate il mio Forum! ecco il link: www.studentsmeeting.forumitalian.com registratevi e pstate, mi raccomando! ;)

Lanello Profilo | Senior Member

devi applicare quello che si chiama "crivello di eratostene"

eccoti la definizione e qualche esempio: http://it.wikipedia.org/wiki/Crivello_di_Eratostene

-----------------------------------------------------
La ricompensa per una cosa ben fatta, è averla fatta.

aiedail92 Profilo | Expert

Il codice non è difficile da implementare; inoltre se posso darti un consiglio, non c'è bisogno di arrivare a controllare fino alla metà per determinare se il numero è primo, ti basta verificare la presenza di divisori fino alla radice quadrata del numero. Posto un esempio di codice:

Function FindPrimes(ByVal count As Integer) As Integer() Dim results(0 To count - 1) As Integer 'Aggiungo l'unico numero primo pari: results(0) = 2 'Il numero correntemente analizzato: 'si parte da 3 e si prendono in consi- 'derazione solo i numeri dispari Dim cur As Integer = 3 'Col ciclo popolo l'array del risultato For i As Integer = 1 To count - 1 start: Dim radq As Integer = Math.Sqrt(cur) Dim divisore As Integer 'dato che abbiamo solo numeri dispari, 'si controllano solo divisori dispari 'fino alla radice quadrata del numero For divisore = 3 To radq Step 2 'se il risultato di una divisione 'da resto zero, il numero non è primo If (cur Mod divisore) = 0 Then 'quindi aumento di due il numero analizzato '(ottenendo il numero disperi successivo) cur += 2 'e ricomincio ad analizzare GoTo start End If Next 'se il risultato di nessuna divisione da 0 'il numero è primo: lo aggiungo al risultato results(i) = cur 'e analizzo il successivo cur += 2 Next Return results End Function


Luca

platino Profilo | Junior Member

Non riesco a far funzionare il codice, perdonami, ma sono poco esperto. L'interfaccia è più o meno questa: inserirsco in una textbox1 il numero di quanti numeri primi desidero che si calcolino (esempio: textbox1.text= 580).
Premendo un pulsante (button1) si avvia il calcolo al etrmine che viene riempita dei risultati (in questo caso, dei 580 numeri primi). Come posso adattare il codice che mi hai postato al mio caso?
che valore devo dare alla variabile "count"? e come faccio a far comparire i risultati nella textbox?
Grazie mille per l'aiuto

_____platino_____
Visitate il mio Forum! ecco il link: www.studentsmeeting.forumitalian.com registratevi e pstate, mi raccomando! ;)

aiedail92 Profilo | Expert

La funzione che ti ho scritto ritorna un array di Integer contenente count numeri primi a partire da 2.

Pertanto puoi decidere se mantenere la funzione così com'è, in modo da farla lavorare fino alla fine e aggiungere i numeri primi alla TextBox tutti assieme, oppure modificare leggermente la funzione e aggiungere i numeri man mano che vengono trovati. Per la seconda opzione, il codice potrebbe diventare così:

Sub FindPrimes(ByVal count As Integer) 'eventualmente pulisci il contenuto della TB tuaTextBox.Clear() 'Aggiungo l'unico numero primo pari: tuaTextBox.AppendText("2" + vbCrLf) 'Il numero correntemente analizzato: 'si parte da 3 e si prendono in consi- 'derazione solo i numeri dispari Dim cur As Integer = 3 'Col ciclo popolo l'array del risultato For i As Integer = 1 To count - 1 start: Dim radq As Integer = Math.Sqrt(cur) Dim divisore As Integer 'dato che abbiamo solo numeri dispari, 'si analizzano solo divisori dispari 'fino alla radice quadrata del numero For divisore = 3 To radq Step 2 'se il risultato di una divisione 'da reto zero, il numero non è primo If (cur Mod divisore) = 0 Then 'quindi aumento di due il numero analizzato '(ottenendo il numero disperi successivo) cur += 2 'e ricomincio ad analizzare GoTo start End If Next 'se il risultato di nessuna divisione da 0 'il numero è primo tuaTextBox.AppendText(cur) tuaTextBox.AppendText(vbCrLf) cur += 2 Next End Sub

Per chiamare la funzione, basta passare come argomento textbox1.Text, il metodo calcola i primi textbox1.Text numeri primi e riempie la TextBox tuaTextBox

Luca

platino Profilo | Junior Member

scusa ancora, ma i risultati vanno in una richtextbox1 e non in una textbox1. scusami ancora, ma non so cosa modificare


_____platino_____
Visitate il mio Forum! ecco il link: www.studentsmeeting.forumitalian.com registratevi e pstate, mi raccomando! ;)

aiedail92 Profilo | Expert

tuaTextBox è un nome fittizio per indicare la TextBox dove inserire i risultati. Ti basta sostituire tutte le occorrenze di "tuaTextBox" in "RichTextBox1" (o il nome della TextBox dove inserire i risultati)

In questo caso lavorare con una RichTextBox o con una TextBox non cambia, dato che i metodi utilizzati sono comuni alle due classi (derivano entrambe da TextBoxBase)

Luca

platino Profilo | Junior Member

Ho modificato il codice come mi hai detto. nell'evento di click del mouse ho messo il codice
me.form1.findprimes(textbox1.text)
E mi da come risultato nella richtextbox1 solo il numero 2 e non tutti i numeri primi che voglio che vangano calcolati (textbox1.text). dove sbaglio???



_____platino_____
Visitate il mio Forum! ecco il link: www.studentsmeeting.forumitalian.com registratevi e pstate, mi raccomando! ;)

Lanello Profilo | Senior Member

devi fare una textbox multilinea, perchè ad ogni risultato la funzione che ti ha scritto Luca manda a capo il cursore.

quindi se non fai una textbox multilinea vedi soltanto il primo risultato.
-----------------------------------------------------
La ricompensa per una cosa ben fatta, è averla fatta.

platino Profilo | Junior Member

Facciamo così: vi posto direttamente il codice che ho scritto:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Sono presenti un pulsante (button1 e una textbox (textbox1).
Dove sbaglio? Il risultato è sempre "2" anche con la proprietà "Multiline" impostata su "true"...





_____platino_____
Visitate il mio Forum! ecco il link: www.studentsmeeting.forumitalian.com registratevi e pstate, mi raccomando! ;)

aiedail92 Profilo | Expert

Ho riprovato il codice, e non mi dà nessun problema...

Quando chiami la funzione, quanto vale TextBox1.Text?

Se non riesci a capire cosa succede, la cosa migliore da fare è procedere un'istruzione alla volta in debug: imposta un punto di interruzione qui:

Sub FindPrimes(ByVal count As Integer)

e controlla cosa succede "step by step"

Luca

platino Profilo | Junior Member

Ho provato a creare un nuovo progetto e il codice ha funzionato. Grazie mille! comunque, siccome il mio scoppo non è tanto quello di copiare il codice, ma di capirlo, visto che lo sto studiando il visual basic, perché non posso mettere un codice del genere?
Sub FindPrimes(ByVal count As Integer) 'eventualmente pulisci il contenuto della TB RichTextBox1.Clear() 'Aggiungo l'unico numero primo pari: RichTextBox1.AppendText("2" + vbCrLf) 'Il numero correntemente analizzato: 'si parte da 3 e si prendono in consi- 'derazione solo i numeri dispari Dim cur As Integer = 3 'Col ciclo popolo l'array del risultato For i As Integer = 1 To count - 1 start: Dim radq As Integer = Math.Sqrt(cur) Dim divisore As Integer 'dato che abbiamo solo numeri dispari, 'si analizzano solo divisori dispari 'fino alla radice quadrata del numero For divisore = 3 To radq Step 2 'se il risultato di una divisione 'da reto zero, il numero non è primo If (cur Mod divisore) = 0 Then 'quindi aumento di due il numero analizzato '(ottenendo il numero disperi successivo) cur += 2 'e ricomincio ad analizzare GoTo start Else 'se il risultato di nessuna divisione da 0 'il numero è primo RichTextBox1.AppendText(cur) RichTextBox1.AppendText(vbCrLf) cur += 2 GoTo start End If Next Next End Sub
Intendo dire...spostando quella parte di codice che dice
'se il risultato di nessuna divisione da 0 'il numero è primo RichTextBox1.AppendText(cur) RichTextBox1.AppendText(vbCrLf) cur += 2 GoTo start
quando controlla se un numero è primo o no, perché non mi da altri risultati oltre a "2" (2 è impostato da codice). Scusa, ma se non lo capisco, mi dev'essere spiegato, se no continuerò a non capire e sbaglierò.Grazie mille comunque





_____platino_____
Visitate il mio Forum! ecco il link: www.studentsmeeting.forumitalian.com registratevi e pstate, mi raccomando! ;)

aiedail92 Profilo | Expert

Non puoi spostare il codice in quella posizione: ti spiego passo passo cosa succede:

Sub FindPrimes(ByVal count As Integer) 'eventualmente pulisci il contenuto della TB TextBox1.Clear() 'Aggiungo l'unico numero primo pari: TextBox1.AppendText("2" + vbCrLf) 'Il numero correntemente analizzato: 'si parte da 3 e si prendono in consi- 'derazione solo i numeri dispari Dim cur As Integer = 3 'Col ciclo popolo l'array del risultato For i As Integer = 1 To count - 1 '---------- start: 'Il primo numero analizzato è 3, quindi 'la sua radice quadrata vale 2 (approssimata) Dim radq As Integer = Math.Sqrt(cur) Dim divisore As Integer 'poichè il ciclo parte avendo divisore 3 'e deve arrivare fino a radq (che vale 2) 'il ciclo si interrompe subito e esce 'dove ci sono i ******** For divisore = 3 To radq Step 2 'qui dentro non ci si arriva mai '(leggi sotto perchè) quindi il numero 'corrente non viene mai aumentato If (cur Mod divisore) = 0 Then cur += 2 GoTo start Else TextBox1.AppendText(cur) TextBox1.AppendText(vbCrLf) cur += 2 GoTo start End If Next '******** 'quindi il numero non viene aggiunto 'dato che hai spostato il codice 'e non viene nemmeno incrementato il numero 'analizzato, che resta 3 per tutto il 'ciclo della funzione: il codice ritorna 'dove ci sono i ---------- e ripete tutto 'uguale daccapo Next End Sub

Luca
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5