• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wysypuje mi sie prosty program - liczby pierwsze.

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
414 wizyt
pytanie zadane 23 kwietnia 2019 w C i C++ przez mrKaczorrro13 Użytkownik (560 p.)

Witam!

Napisalem sobie taki malutki program obiektowo pokazujacy "n" liczb pierwszych. Nie wiem czemu po kilkukrotnym wpisaniu liczby "n" program mi sie wysypuje. Czasem za 2 razem a czasem za 10, nie ma konkretnej reguly. Podejrzewam, ze jest to cos ze zlym zarzadzaniem pamiecia. Prosze bardzo o pomoc. Z gory wielkie dzieki! 

Main:

#include <iostream>
#include "header.h"

int main()
{
    int n=0;
    std::cout<<"Podaj ile liczb pierwszych chcesz wyswielic?\n";
    std::cout<<"Wcisnij q zeby zakonczyc!\n";
    while(std::cin>>n)
    {
      
        show_prime(n);
        std::cout<<"Podaj ile liczb pierwszych chcesz wyswielic?\n";
        
    }
    return 0;
}

Definicja:

#include <iostream>
#include "header.h"

void show_prime(int n)
{
    int *prime=new int[n];
    prime[0]=2;
    int liczby=0;
    for(int i=2; i<=10*n; ++i)
    {
        bool t=true;

        for(int l=0; l<=liczby; ++l)
        {
            if(i%prime[l]==0)
            {
                t=false;
                break;
            }
            else if(t==true && l==liczby)
            {
                liczby++;
                prime[liczby]=i;
                std::cout<<"PRIME: "<<i<<std::endl;
            }
        }
        if(liczby==n)
            break;
    }
    delete[] prime;
}

Header.h


void show_prime(int n);

 

1
komentarz 23 kwietnia 2019 przez Dawid Markiewicz Obywatel (1,590 p.)
edycja 23 kwietnia 2019 przez Dawid Markiewicz

Napisalem sobie taki malutki program obiektowo

 co to ma wspólnego z programowaniem obiektowym?

Spójrz tutaj

2 odpowiedzi

+1 głos
odpowiedź 23 kwietnia 2019 przez j23 Mędrzec (195,240 p.)
edycja 23 kwietnia 2019 przez j23

Zgaduje, że w wewnętrznej pętli for zmienna liczby staje się większa lub równa n.

 

PS. zmienna t jest bez sensu.

komentarz 23 kwietnia 2019 przez mrKaczorrro13 Użytkownik (560 p.)
Super, poprawki zrobione. Dziekuje bardzo za pomoc:)
komentarz 23 kwietnia 2019 przez mrKaczorrro13 Użytkownik (560 p.)

@j23, 

Ale wlasnie chce zeby porogram przestal dzialac jak zmienna liczby bedzie rowna z n.

  if(liczby==n)
            break;

W sumie za kazdym razem daze do tego zeby te dwie zmienne sie zrownaly. Nie wiem czemu czasem jak podam n=10000 to petla while wszystko obliczy poprawnie i zada mi ponownie pytanie a czasem nie wiem czemu podam to samo n.

Zmienilem n z int na unsigned long int i dalej nie dziala. 

1
komentarz 23 kwietnia 2019 przez niezalogowany
edycja 24 kwietnia 2019

 nikt nie odpowiedział 

spać nie mogę to skrobnę

mi też tak się działo jak analizowałem twój kod wcześniej też się zastanawiałem, ale jak przeskakuje o 2 to tak się nie dzieje ale też nie wiem dlaczego

void show_prime(unsigned int n)
{
    unsigned int *prime=new unsigned int[n+1]; /// to
    prime[0]=2;
    prime[1]=3;
    unsigned int liczby=0;
    for(size_t i=3;; i+=2) /// to petla niekończona przeskok o 2
    {
     /// zapomiałem dodać ***********************
        if(i==4294967293) {
        std:: cout<< "na co Ci taka duża liczba pierwsza";
         break;}
     /// ***********************************

        for(size_t l=0; l<=liczby; ++l)
        {
           if(i%prime[l]==0)
            {
               break;
            }
            else if(l==liczby)
            {
                liczby++;
                prime[liczby]=i;
                std::cout<<"else_liczby="<<liczby<<std::endl;
                std::cout<<"PRIME: "<<i<<std::endl;
            }
        }
        if(liczby==n) // tu masz warunek kończy pętlę
            break;
    }
    delete[] prime;
}

 

komentarz 24 kwietnia 2019 przez mrKaczorrro13 Użytkownik (560 p.)

Dzieki wielkie za podpowiedz! Wydaje mi sie to co najmniej dziwne, ze dziala z inkrementacja o 2 a z inkremenetacja o 1 program sie zawiesza... Tak mysle, ze temu program sie zawiesza bo gdzies w pamieci zostaja zapsiane dane i kiedy program probuje przez przypadek to samo miejsce w pamieci nadpisac, to sie zawiesza. (Tak wiem, fenomenalne odkrycie...;p).  To by tlumaczylo czemu program sie zawiesza czasem po wykonaniu sie 2 razy a czasem po wykonaniu sie 10 razy. 

Na pewno jeszcze pomysle nad tym i poczukam, jak znajde przyczyne to z checia sie podziele:) 

PS. Znalazlem w internecie fajna stronke z zadaniami i jak zaczalem rozwiazywac jedno z zadan to postanowilem, ze napisze sobie taki maly programik ktory bedzie wyswietlal liczby pierwsze.  Jezeli jestes zainteresowany to tutaj jest stronka:

https://projecteuler.net/about

komentarz 24 kwietnia 2019 przez j23 Mędrzec (195,240 p.)

@mrKaczorrro13,  nieco ogarnąłem ten twój kod:

void show_prime(unsigned n)
{
    if(n == 0) return;

    unsigned *prime = new unsigned[n] { 2, };
    unsigned liczby = 1;
    
    std::cout << prime[0] << '\n';
    
    for(unsigned i = 2, l; i <= 10 * n && liczby < n; ++i) {
        
        for(l = 0; l < liczby; ++l) {
            if(i % prime[l] == 0) break;
        }
        
        if(l == liczby) {
            prime[liczby++] = i;
            std::cout << i << '\n';
        }
    }
    
    delete[] prime;
}

 

komentarz 24 kwietnia 2019 przez niezalogowany

@ j23

Fajnie i przejrzyście napisany kod ale na wyjściu:

 99961 liczba=9589 99971 liczba=9590 99989 liczba=9591 99991 liczba=9592
czas dzialania=16.027

a chyba powinno być liczba=9999;

8 104729 liczba=9999 104743 liczba=10000
czas dzialania=16.491

komentarz 24 kwietnia 2019 przez j23 Mędrzec (195,240 p.)

Nie wnikałem w poprawność algorytmu, po prostu poprawiłem kod tak, żeby nie wywalał programu. Tam w zasadzie trzeba wywalić warunek i <= 10 * n z pętli głównej, wtedy funkcja wypisze wszystkie liczby.

 

 

komentarz 24 kwietnia 2019 przez niezalogowany
Ten komentarz to był mimochodem,kod bardzo fajnie uproszczony i wizualnie ładnie wygląda, ale jak widzę algorytm wypisywania liczb pierwszych to zawsze kusi mnie posprawdzać czasy oczywiście przy takich samych złożeniach, i na oko mi się wydało mniej to sprawdziłem.
komentarz 25 kwietnia 2019 przez mrKaczorrro13 Użytkownik (560 p.)

@j23, @fisker

Mega! Juz sobie wszystko uporzadkowalem i dziala tak jak trzeba. Dziekuje bardzo wszystkim za pomoc!:)

+1 głos
odpowiedź 23 kwietnia 2019 przez Dawid Markiewicz Obywatel (1,590 p.)

Kolego nie wiem co ty tam napisałeś ale ten twój kod nie dosyć ze jest strasznie nieczytelny to jeszcze okropnie nie wydajny po co tak komplikować?

void show_prime(int n)
{
	for (int i = 2; i < n; i++)
		for (int j = 2; j < i; j++)
		{
			if (i % j == 0)
				break;
			else if (i == j + 1)
				std::cout << "PRIME: " << i << std::endl;
		}
}

Powodzenia!

1
komentarz 23 kwietnia 2019 przez mrKaczorrro13 Użytkownik (560 p.)
No coz... zdaje sobie sprawe ze jeszcze bardzo duzo nauki przede mna;D Dziekuje bardzo za pomoc! :)

Podobne pytania

0 głosów
1 odpowiedź 178 wizyt
pytanie zadane 10 stycznia 2020 w C i C++ przez MaTiDxxx Początkujący (290 p.)
0 głosów
1 odpowiedź 315 wizyt
0 głosów
0 odpowiedzi 199 wizyt

93,432 zapytań

142,428 odpowiedzi

322,661 komentarzy

62,796 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

...