[C] Szukanie liczb pierwszych

[C] Szukanie liczb pierwszych
FO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 79
0

Napisałem taki oto kod na szukanie licz pierwszych z godnie z algorytmem sito eratostenesa
tylko coś nie chce działać i nie widzę dlaczego

Kopiuj
#include <stdio.h>
#define N 10000

int main(void)
{
        int granica, pierwiastek;
        int tab[N];
        int i,j;

        pierwiastek=(int)sqrt((double)granica);
        printf("Podaj granice szukania liczb pierwszych: ");
        scanf("%d", &granica);

        for(i=0; i<=granica; i++)
                tab[i]=i;

        for(i=2; i<=pierwiastek; i++)
        {
                if(tab[i]!=0)
                {
                        for(j=2*i; j<=granica; j+=i)
                                tab[j]=0;
                }
        }

        for(i=2; i<=granica; i++)
                if(tab[i]!=0)
                        printf("%d ", tab[i]);


        printf("\n");
        system("pause");
        return 0;
}
Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0
Kopiuj
        pierwiastek=(int)sqrt((double)granica);
        printf("Podaj granice szukania liczb pierwszych: ");
        scanf("%d", &granica);

Zastanów się co tutaj robisz, rozpisz po kolei na kartce co się dzieje, czy aby na pewno dobra kolejność, etc.


PS: co jak podam jako granicę np.`100000`? Pomyśl nad użyciem tablic dynamicznych tutaj.

PS2: debugger twoim przyjacielem.

FO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 79
0

ups. faktycznie. Poprawiłem to ale i tak wywala jakiś błąd i strzałka pokazuje ta linijkę

Kopiuj
 if(tab[i]!=0)
FO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 79
0

więc jest tak

Debugger exception notification
project projest1.exe raised exception class EAccessViolation witch message 'AccessViolation at address 004011F5. read of address 00194000'. Process stopped. use step or run to continue

unikalna_nazwa
  • Rejestracja: dni
  • Ostatnio: dni
0

a granicę dałeś mniejszą niż 10000?

btw skoro masz tab[i] = i to masz tu nadmiarowość danych bo "i" masz cały czas podane
wystarczy bool do tego i tab[i] = true, a potem zmiana na false w sicie i będziesz miał 4x mniejsze zużycie pamięci
a jakbyś się pobawił bitami to nawet 32x mniejsze

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0

Na GCC 4.4.1 wszystko działa ok.

FO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 79
0

ja korzystam z borland c++ builder 6
to jest tak ze wpisuje ta granice w programie i dopiero jest błąd

FO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 79
0

Jakieś pomysły dlaczego mi to nie działa ??

unikalna_nazwa
  • Rejestracja: dni
  • Ostatnio: dni
0

bo podajesz granica >= 10000?

FO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 79
0

niby gdzie??

unikalna_nazwa
  • Rejestracja: dni
  • Ostatnio: dni
0

z klawiatury - to było pytanie
bo ten program co podałeś działa poprawnie w innych warunkach ( http://ideone.com/Jfgyq ) i jeśli to nie to, to nie mówisz nam wszystkiego ;)

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0

Sprawdź to:

Kopiuj
#include <stdio.h>
#include <math.h>

int main()
{
    int granica, pierwiastek;
	int i, j;

	scanf("%d", &granica);

	bool* tab = new bool[granica];

	pierwiastek=sqrt(granica);

	for(i=0; i<=granica; i++)
		tab[i]=true;

	for(i=2; i<=pierwiastek; i++)
		if(tab[i])
			for(j=2*i; j<=granica; j+=i)
				tab[j] = false;

	for(i=2; i<=granica; i++)
		if(tab[i])
			printf("%d ", i);

	return 0;
}
FO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 79
0

wpisuje granice wciskam enter i jest coś takiego
image jpg 1451-240

unikalna_nazwa
  • Rejestracja: dni
  • Ostatnio: dni
0

naciśnij step, potem do watch dodaj i i pokaż co wyszło

FO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 79
0

gdzie niby mam nacisnąć to step. mam zainstalowanego jeszcze visual studio 2010 ale nie wiem jak on działą

FO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 79
0

więc klikam step over i wyświetla ten sam komunikat

adf88
  • Rejestracja: dni
  • Ostatnio: dni
0

Gdzieś już coś podobnego widziałem. Prawdopodobnie sqrt zwraca złą wartość z powodu braku odpowiedniego include'a. Dodaj #include <math.h>, powinno załatwić sprawę. I jeszcze <stdlib.h> dla funkcji system.

FO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 79
0

Działa. Dzięki!!

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.