Liczba pierwsza

0

Witam!
Chciałem napisać program który wypisuje liczby pierwsze na zasadzie wypisywania kolejnych liczb naturalnych i sprawdzeniu ich przy pomocy funkcji if (gdy reszta z dzielenie wszystkich poprzednio wypisanych liczb nie równa się 0 to wypisujemy tą liczbę itd.)
zaczynając od liczby 2 np.
liczba 2 gdy podzielimy ją przez poprzednie liczby (w tym wypadku nie ma dzielnika) daje reszty inną niż 0 wiec wypisuje ją do ciągu
liczba 3 podzielona przez wszystkie poprzednie liczby (czyli tylko 2) daję resztę inną niż zero i wpisujemy ją do ciągu
liczba 4 podzielona przez wszystkie poprzednie liczby (2 i 3) daje resztę w jednym z przypadków 0 (4/2=2 bez reszty) wiec pomijamy ją
wiec na razie nasz ciąg wygląda tak:
2
3
Teraz tylko nie wiem jak to zrobić.
Zrobiłem szkic algorytmo-podobny: http://img863.imageshack.us/img863/7253/liczbapierwsza.jpg
i zacząłem pisać program który nie działa tak jak powinien:

#include <iostream>

using namespace std;

int main()
{
 
 int a, n;
 int i;
 
 cout<<"Podaj n ";
 cin>>n;
 cout<<endl;
 
 for (i=2;i<n;++i)
    
 for (a=2;a<n;++a)
if (i%a)


{
    cout <<i<<endl;
}

 cout <<endl<<"Nacisnij ENTER aby zakonczyc"<<endl;
 getchar();
 return 0;
}    
 

Proszę o pomoc w napisaniu programu według mojego pomysłu lub innego :)
Z góry dziękuję

1

Przede wszystkim po co sprawdzasz każdą liczbę pokolei, skoro wiadomo, że każda liczba parzysta za wyjątkiem 2 nie jest liczbą pierwszą. poza tym, sprawdzaj liczby których pierwiastek nie jest liczbą całkowitą, znacznie przyspieszy to program

1

Ogólnie to w teście na pierwszość liczby szukamy tylko do pierwiastka z k bo dalej nie ma już sensu.

0
#define ile 1000

main(){
	int p[ile];
	int j=2; p[0]=2; p[1]=3;
	int i=5;
	int * k;
	int s=2;
	while(j<ile){
		k=p; 
		while(*k**k++<=i){
			if(i%*k==0){
				k=0; break;}
		}
		if(k!=0){
			p[j++]=i;
		}
		i+=s; s^=6;
	}

	for(i=0;i<j;i++){
		printf("%7d ",p[i]);
		if(i%10==9) printf("\n");
	}
} 
0

@Xitami, za ten kod można w zęby dostać. Nawet w ANSI C już nie było typu domyślnego int, natomiast kolejność ewaluacji argumentów operatorów innych niż &&, ||, ?: i , jest nieokreślona. *k**k++ zależnie od kompilatora i jego ustawień może zostać wykonane jako:

int v1 = *k;
int v2 = *k++;
int v3 = v1 * v2;

lub

int v1 = *k++;
int v2 = *k;
int v3 = v1 * v2;

Mam nadzieję, że w życiu nie napisałeś linijki kodu, z której ktoś miałby korzystać.

0

A tak może być? Też działa Ideone.com

#ifndef __DATE__
	i*o=&I[1+'='=='='];
	OOO(*o**o<=O)
		OO0 O%*o++==1-1){
			o=0;break;}if(o!=0) 
#else
     #undef __DATE__
                    #define ile 1000
                    		    #define poile 10
#define OOO while
#define   OO0 if(
#define O0O     6
#define   i   int

main(i O,i *OO, i O0){
	OO0 !O){
		OOO(O<O0){
			printf("%7d",OO[O]);
			OO0 O++%poile==poile-1)puts("");
		}
        } else OO0 O==1) {
		i I[ile]={1,3,5,6,66,666};i l=1<<O;O+=l+1+1;
		I[(I[0]=l)-1]=I['-'-'-']+1<<0;O0='/'/'/'+1; 
		l<<=1=='='/'=';
		OOO(O0-ile<0){
			#include __FILE__
			//*** czy liczba pierwsza ***\\
			if(random()%2==0)
				I[O0++]=O;
			O+=l^=O0O;}
		main(0, I, O0);
	} else printf("Alleluja");
	return "return"
	"koniec  pieśni" 
	&&0;
} 
#endif 
0

Dzięki wielkie za pomoc :)

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