[C] Szukanie liczb pierwszych

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

#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;
}
0
        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.

0

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

 if(tab[i]!=0)
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

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

0

Na GCC 4.4.1 wszystko działa ok.

0

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

0

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

0

bo podajesz granica >= 10000?

0

niby gdzie??

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 ;)

0

Sprawdź to:

#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;
}
0

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

0

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

0

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

0

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

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.

0

Działa. Dzięki!!

1 użytkowników online, w tym zalogowanych: 0, gości: 1