Algorytm do wyliczania liczb pierwszych
Ostatnio zmodyfikowano 2016-08-31 09:53
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: #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; 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ę. |
|
darko202 |
» 2016-08-31 08:14:17 |
|
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 |
|
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? |
|
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ć max = sqrt( n ) for( i = 2; i <= max; i++ ) { } |
|
darko202 |
» 2016-08-31 09:53:13 1. wielokrotnie piszesz poza zakres tablicy, np. gdy y = l6 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ś 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=17C0A2FBB30F4EFD8768611BFD0AA55Bdzięki niej możesz widzieć stan każdej zmiennej w każdej linijce programu i obserwować sam przebieg, jak to się wykonuje |
|
« 1 » |