Strona: [  << <   1   > >>  ]  z  1     
Autor Temat: Kto chciałby spróbować swoich sił
Piotr T




Typ: neutral
Postów: 176
Zarejestrowany: May 2004
Kto chciałby spróbować swoich sił

Zadanie kontrolne

Opis problemu:

Liczba pierwsza jest to liczba, która jest podzielna bez reszty tylko przez 1 i przez samą siebie. Przykłady liczb, które są liczbami pierwszymi to: 5,7,13. Przykłady liczb, które nie są liczbami pierwszymi są: 4 (bo jest podzielna przez 2), 9 (podzielna przez 3) czy też np. 42 (podzielna przez 6 i przez 7).

Zadanie:
Wykonać aplikację, która:
.  po uruchomieniu użytkownik wpisze ilość liczb N (korzystając z pola tekstowego), które chciałby znaleźć
.  po naciśnięciu Command Button dokona stosownych obliczeń wyświetlając każdą z kolejnych znalezionych liczb pierwszych w listbox.


Celem zadania jest wyznaczenie kolejnych N liczb pierwszych większych od 3, gdzie N jest argumentem pobranym z pola textbox
Wartość N nie może przekraczać zakresu Integer
no chyba że ktoś jest tak dobry że poradzi sobie z większym zakresem


Przykład: Chciałbym znaleźć 50 liczb pierwszych
czyli zaczynam szukać  zaczynając od liczby 4  i wynajdując 50 licz pierwszych

[Post edytowany dnia 26-09-2004 20:42 przez Piotr T]


_____________________________________________
Visual Basic.NET - Mercedes dla programistów

25-09-2004 21:25
Pokaż profil Piotr T  Wyślij email do Piotr T   Odwiedź stronę Piotr T  
mikmas
From Łódź Stadt




Typ: neutral
Postów: 772
Zarejestrowany: Apr 2003

Czy o to Ci chodziło?
ftp://protom.one.pl/pub/usr/mm/vb4all.rar
Plik wysłałem także na maila!


_____________________________________________
4C;65;70;69;65;6A;20;62;79;9C;20;73;69;EA;20;
62;61;72;64;7A;69;65;6A;20;73;6B;6F;6E;63;65;
6E;74;72;6F;77;61;B3;20;6E;61;20;6F;64;70;6F;
77;69;65;64;7A;69;2C;20;61;20;6E;69;65;20;6E;
61;20;72;6F;7A;73;7A;79;66;72;6F;77;79;77;61;
6E;69;75;20;3A;50

25-09-2004 23:46
Pokaż profil mikmas  Wyślij email do mikmas   Odwiedź stronę mikmas       3632553
Piotr T




Typ: neutral
Postów: 176
Zarejestrowany: May 2004

Jestem pod wrażeniem, choć napisałeś program który wyklucza liczby pierwsze - a miały być wyświetlone tylko liczby pierwsze. Przesyłam Ci zmodyfikowany kod - a tak apropos to zadanie jest jednym z zadań zaliczeniowych Microsoft na MCP (Microsoft Certified Programing)


_____________________________________________
Visual Basic.NET - Mercedes dla programistów

26-09-2004 08:03
Pokaż profil Piotr T  Wyślij email do Piotr T   Odwiedź stronę Piotr T  
mikmas
From Łódź Stadt




Typ: neutral
Postów: 772
Zarejestrowany: Apr 2003

Miały być wyświetlone tylko liczby pierwsze? A to nie doczytałem .


_____________________________________________
4C;65;70;69;65;6A;20;62;79;9C;20;73;69;EA;20;
62;61;72;64;7A;69;65;6A;20;73;6B;6F;6E;63;65;
6E;74;72;6F;77;61;B3;20;6E;61;20;6F;64;70;6F;
77;69;65;64;7A;69;2C;20;61;20;6E;69;65;20;6E;
61;20;72;6F;7A;73;7A;79;66;72;6F;77;79;77;61;
6E;69;75;20;3A;50

26-09-2004 11:14
Pokaż profil mikmas  Wyślij email do mikmas   Odwiedź stronę mikmas       3632553
andrey
Łódź



Typ: neutral
Postów: 295
Zarejestrowany: Mar 2003

Witam,
Skoro ten mały konkurs mikmas został rozwiązany, można chyba podać dla co ciekawszych rozwiązanie.
Ja podam kilka sposobów na odnajdywanie liczb naturalnych:

1) Liczby Fermata - tym sposoben znajdziemy tylko kilka liczb naturalnych. Ogólny wzór na liczby Fermeta to: l_fermata(a) = 2^(2^a) + 1
l_fermata(1) = 5
l_fermata(2) = 17
l_fermata(3) = 257
l_fernata(4) = 65537

2) Metoda przedstawiona przez Adrien Marie Legendre - tą metodą znajdziemy liczby pierwsze dla a = 1,2,3,...,28 Wzór przyjmuje postać: l_adrien(a) = 2*(a^2) + 29

3) Metoda odnajdywania liczb pierwszych dla a = 1,2,3,...40 l_pierwsze_metoda_trzecia(a) = (a^2) -  a + 41

4) Metoda odnajdywania licz pierwszych dla a = 1,2,3,...79 l_pierwsze_metoda_czwarta(a) = (a^2) &#8211; (79*a) + 1601

5) Sito Eratostenesa jest to chyba najlepsza metoda odnajdywania liczb pierwszych z liczb naturalnych. Na czym ona polega? Otoż z ciągu liczb naturalnych np.: 1,2,3,... wybieramy pierwszą w kolejności większą od 1 i usuwamy z ciągu wszelkie jej wielokrotnosci wieksze od niej samej czyli w przypadku dwojki bedzie to 2,4,6,... z pozostałych w ciągu liczb wybieramy najmniejszą pozostałą liczbę będzie to trzy i usuwamy także jej wielokrotności większe od niej samej czyli dla trójki będzie to 6,9,12,... Z pozostałych liczb ciągu wybieramy najmniejszą i usuwamy wjej wielokrotnosci. Kiedy konczymy? Nigdy mozemy to wykonywac w nieskonczonosc   Może rozwiniemy konkurs PiotraT i zamieścimy w tym wątku najwydajniejsze metody na "Sito" ?

Edit: Dodam, że nie podałem nawet ułamka metod na odnajdywanie liczb pierwszych.

Pozdrawiam
Andrzej

[Post edytowany dnia 26-09-2004 12:22 przez andrey]


_____________________________________________
http://www.carbondesign.pl/ - rowery poziome, trójkołówce, handbike-i, tuning, akcesoria

26-09-2004 12:20
Pokaż profil andrey  Wyślij email do andrey   Odwiedź stronę andrey       3078613
losmac
"profesorek"




Typ: neutral
Postów: 758
Zarejestrowany: May 2003
Przykład...

Oto jeden ze sposobów:

Option Explicit

Sub DajLiczbyPierwsze(iOd As Long, iDo As Long, lst As MSForms.ListBox)
Dim i As Long, retVal As Long

'testuj czy liczba z zakresu jest liczbą pierwszą
For i = iOd To iDo
    retVal = CzyLiczbaPierwsza(i)
    'jeśli tak, dodaj do listy
    If retVal Then lst.AddItem i
Next i

End Sub

Function CzyLiczbaPierwsza(liczba As Long) As Boolean
Dim i As Long, j As Long, retVal As Long

'omijam 1 i samą siebie (liczbę)
For i = 2 To liczba - 1
    retVal = liczba Mod i
    If retVal > 0 Then j = j + 1
Next i

'jeżeli za każdym razem zwracana była różnica z dzielenia, to jest to liczba pierwsza!
If j = liczba - 2 Then CzyLiczbaPierwsza = True

End Function


Choć rozwiązanie nie jest najszczęśliwsze (bo w przypadku dużych liczb zajmuje multum czasu), to jednak skuteczne!

[Post edytowany dnia 26-09-2004 12:34 przez losmac]


_____________________________________________
POSTULATY STARUSZKA:
1) Ludzie, dbajcie o polszczyznę!!!
2) Ludzie, zadawajcie kompletne pytania, a nie rzucacie ochłapy i trzeba się domyślać o co chodzi!!!

Powodzenia
Maciej Łoś

26-09-2004 12:29
Pokaż profil losmac  Wyślij email do losmac   Odwiedź stronę losmac  
Piotr T




Typ: neutral
Postów: 176
Zarejestrowany: May 2004

losmac - wszystko ok kod bardzo przejrzysty dla ustawionego zakresu odliczby-doliczby tylko zadanie polega na wyszukaniu np 1000 liczb pierwszych poczynając od liczby 3, ale pozatym wszystko jest ok
----------------
Dzisiaj testowałem na PII 233 Mhz wyszukanie jednego miliona licz pierwszych i bagatelka komputer pracował nad wynikiem 2,5 godz.
----------------

A oto kod wykonany przez kolegę Mikmasa - tylko z lekka zmodyfikowany

Dim PRZERWANIE As Boolean

Private Sub Command1_Click()
Dim ST As Variant, SK As Variant
Command2.Enabled = True
lstPier.Visible = False
ST = Timer
Me.Text1 = Now
lstPier.Clear 'Czyść listboxa z liczbami pierwszymi z poprzedniej selekcji

Dim ODLICZBY As Long, ILELICZB As Long 'Zmienne zakresu od... do...
Dim I As Integer 'Podręczna zmienna uczestnicząca w selekcji
Dim OK As Boolean ' sprawdzian czy liczba jest pierwsza
Dim LICZNIK As Long
ILELICZB = Val(txtDo.Text)

Me.PBProgress.Max = ILELICZB  'Ustaw wartość odpowiadającą 100% w pasku postępu
'
PRZERWANIE = False
LICZNIK = 0
ODLICZBY = 4
   
    Do Until LICZNIK = ILELICZB
        For ODLICZBY = ODLICZBY To ODLICZBY + 1 'No i zaczynamy!
            Me.PBProgress.Value = LICZNIK + 1 'Ustaw postęp
            DoEvents 'Żeby wykonał operacje czekające w kolejce
            OK = False
            If PRZERWANIE = True Then Exit Do
            'Pętla sprawdzająca, czy wybrana liczba jest
            'podzielna przez którąś liczbę z tego zakresu
       
                For I = 2 To 9 ' wystarczy od 2 do 9
                    If ODLICZBY / I = Int(ODLICZBY / I) And I <> ODLICZBY Then
                        OK = True
                        Exit For
                    End If
                Next
               
            If OK = False Then
            lstPier.AddItem ODLICZBY ' dodaje jeśli jest liczbą pierwszą
            LICZNIK = LICZNIK + 1
            End If
        Next
    Loop
   
SK = Timer
Me.Show
Me.Text2 = Now
Me.Text3 = SK - ST
lstPier.Visible = True
Command2.Enabled = False
End Sub

Private Sub Command2_Click()
PRZERWANIE = True
' przerwij proces jeśli jesteś znudzony czekaniem
End Sub


I jeszcze istnieje nagroda 50000$ za wyszukanie największej liczy pierwszej...


_____________________________________________
Visual Basic.NET - Mercedes dla programistów

26-09-2004 20:19
Pokaż profil Piotr T  Wyślij email do Piotr T   Odwiedź stronę Piotr T  
losmac
"profesorek"




Typ: neutral
Postów: 758
Zarejestrowany: May 2003

Chciałem tylko podać przykład. Określenie, ile liczb ma wyszukać nie stanowi żadnej przeszkody. Ja podawałem zakres liczb do testowania, po to, by sprawdzić tylko, czy kod działa właściwie.


Sub DajLiczbyPierwsze(ile As Long)
Dim i As Long, j As Long, retVal As Long

j = 0
Do While j < ile
    i = i + 1
    retVal = CzyLiczbaPierwsza(i)
    If retVal Then
        j = j + 1
        'a tu co się tylko podoba
    End If
Loop

End Sub



_____________________________________________
POSTULATY STARUSZKA:
1) Ludzie, dbajcie o polszczyznę!!!
2) Ludzie, zadawajcie kompletne pytania, a nie rzucacie ochłapy i trzeba się domyślać o co chodzi!!!

Powodzenia
Maciej Łoś

26-09-2004 21:09
Pokaż profil losmac  Wyślij email do losmac   Odwiedź stronę losmac  
Wszystkich odpowiedzi: 7 :: Maxymalnie na stronę: 20
Strona: [  << <   1   > >>  ]  z  1