Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Algorytm do wyliczania liczb pierwszych

Ostatnio zmodyfikowano 2016-08-31 09:53
Autor Wiadomość
latajacaryba
Temat założony przez niniejszego użytkownika
Algorytm do wyliczania liczb pierwszych
» 2016-08-31 00:49:11
Witam. Po jakichś 2 godzinach bezowocnego programowania udało mi się napisać to:
C/C++
#include <iostream>
using namespace std;

int main()
{
    int jesli = 0;
    int l6;
    cout << "podaj liczbe nr. 6" << endl;
    cin >> l6;
    int * tablica = new int[ l6 ];
    int * liczbypierwsze = new int[ l6 ];
    int ile_liczb_pierwszych = 0;
    tablica[ 0 ] = 0;
    tablica[ 1 ] = 1;
    for( int y = 0; y <= l6; y++ )
    {
        liczbypierwsze[ y ] = 0;
    }
    for( int x = 2; x <= l6; x++ )
    {
        tablica[ x ] = x;
    }
   
   
    for( int x = 2; x <= l6; x++ )
    {
        jesli = 0;
        //cout<<"teraz x "<<x<<endl;
       
        for( int z = 2; z < 10; z++ )
        {
            if( tablica[ x ] % z == 0 )
            {
                jesli++;
            }
            if( jesli < 3 )
            {
                liczbypierwsze[ ile_liczb_pierwszych ] = tablica[ x ];
                cout << "ileliczb= " << ile_liczb_pierwszych << "\t\t\t\t a tablicaliczb= " << liczbypierwsze[ ile_liczb_pierwszych ] << endl;
                ile_liczb_pierwszych++;
               
            }
        }
    }
    for( int t = 2; t <= ile_liczb_pierwszych; t++ )
         cout << liczbypierwsze[ t ] << endl;
   
}
Zagmatwany. Gdyby tylko jeszcze działał, ale nawet tego nie robi. W akcie desperaci postanowiłem wstawić go tu, na forum z nadzieją, że ktoś mądrzejszy znajdzie błąd, bo ja już nie mam do tego siły. Jeśli ktoś zna lepszy sposób (tylko bez klas i bibliotek niestandardowych )proszę napisać. A, i te liczby pierwsze będą mi potrzebne więc jeśli ktoś napisze taki program to proszę umieścić je np. w tablicy tak, by były dostępne do działań. Z góry dziękuję.
P-151272
darko202
» 2016-08-31 08:14:17
1.
algorytm jest znany i można znaleźć wiele jego realizacji
http://www.bing.com/search​?q=c%2B%2B+licby+pierwsze++algo​rytm​&qs=n&form=QBRE​&pq=c%2B%2B+licby+pierwsze+al​&sc=0-21&sp=-1&sk=&ghc=1​&cvid=539E9654D7DC45E1BCF470F5FF70A605
poszukaj

2.
najprostszy
http://www.algorytm.edu.pl​/algorytmy-maturalne​/badanie-czy-liczba-pierwsza.html


3.
niepoważne jest to ze nie napisałeś co Ci nie działa  :((
masz u mnie minus

4.
jakbyś zastąpił 10 z poniższego for  przez l6 (zmienna małe L + 6) to 
przypominałoby to np. algorytm opisany w p2
i zwracał liczby pierwsze
C/C++
for( int z = 2; z < 10; z++ )
{
    if( tablica[ x ] % z == 0 )
   
P-151273
latajacaryba
Temat założony przez niniejszego użytkownika
» 2016-08-31 08:20:23
Mówiąc nie działa miałem na myśli, że program "nie odpowiada" po włączeniu, już pominąłem to że tych licz nie wylicza
P-151274
latajacaryba
Temat założony przez niniejszego użytkownika
» 2016-08-31 08:25:27
Co do zamiany 10 na l6 to po co dzielić x przez wszystkie liczby aż do l6 skoro liczba niepodzielna przez cyfry oprócz 1 z tego co mi wiadomo jest liczbą pierwszą, dlatego dzieliłem przez zakres 2-9.
Edit. Gwoli ścisłości dodam, że musi być oczywiście podzielna przez samą siebie ale to w programie uwzględniłem :)

I jeszcze jedno pytanko: dlaczego
for( int i = 2; i * i <= n; i++ )
 i jest warunek "jeśli i^2 <=n"?

Czy to dlatego, że gdyby było
for( int i = 2; i <= n; i++ )
 to liczby np. 2 lub 3 nie byłyby uznawane za liczby pierwsze? Bo z tego co zrozumiałem to warunek jest spełniany tylko wtedy kiedy i^2<=n czyli przy  liczbach 2 i 3 ta pętla w ogóle się nie wykona bo i^2 jest > od 3. Czy dobrze rozumiem?
P-151275
mateczek
» 2016-08-31 09:18:12
I jeszcze jedno pytanko: dlaczego jest warunek "jeśli i^2 <=n"?

jak chcesz sprawdzić liczbę 17 brutalnym-forsem :P to wystarczy, że sprawdzisz jej dzielniki od 2 do CałkowityPierwiastekZ(17)=4. I stąd masz ten kwadrat.
zamiast kwadratu mógł byś napisać
C/C++
max = sqrt( n ) // n - testowana liczba
for( i = 2; i <= max; i++ ) {
    //tu sprawdzać dzielniki
}
P-151276
darko202
» 2016-08-31 09:53:13
1.
wielokrotnie piszesz poza zakres tablicy,
np. gdy y = l6 

C/C++
int l6;
...
cin >> l6;
...
int * liczbypierwsze = new int[ l6 ];
...
for( int y = 0; y <= l6; y++ )
{
    liczbypierwsze[ y ] = 0;
}

wielokrotnie !!
tzn. robisz to we wszystkich for

2.
zastanów się nad warunkiem
 if( jesli < 3 ) 
na starcie jest spełniony więc  :(((
zawsze się wykonuje
i robi to co tam wpisałeś

C/C++
jesli = 0;
...
for( int z = 2; z < 10; z++ )
{
    if( tablica[ x ] % z == 0 )
    {
        jesli++;
    }
    if( jesli < 3 )
    {
        liczbypierwsze[ ile_liczb_pierwszych ] = tablica[ x ];
        ile_liczb_pierwszych++;

3.
naucz się technologii debugowania programu
http://www.bing.com/search​?q=debug+program+c%2B%2B+vs​&qs=n&form=QBRE​&pq=debug+program+c%2B%2B​&sc=0-17&sp=-1&sk=​&cvid=17C0A2FBB30F4EFD8768611BFD0AA55B

dzięki niej możesz widzieć stan każdej zmiennej w każdej linijce programu
i obserwować sam przebieg, jak to się wykonuje
P-151277
« 1 »
  Strona 1 z 1