Wypisywanie liczb pierwszych

0

Witam,
mam do napisania program w C++, który przy pomocy dwóch zagnieżdżonych pętli for będzie wypisywał liczby pierwsze z danego zakresu.
Chciałbym Was zapytać,czy dobrze to zrobiłem?

#include <iostream>
using namespace std;

int main()
{

for(int i = 0; i<100;  i++)
{
    for(int k = i; (k%2==1); k++)
    cout << k << endl;

}

    }
 
0

Ten kod wypisuje po prostu co drugą liczbę.
Czy według Ciebie 15 jest liczbą pierwszą?

0

No nie, nie jest.
Eh... podzielne przez 1 i samą siebie. To nie wiem jak by ten warunek zapisać. i%1 == 0?

0

Jeżeli musisz to koniecznie zrobić za pomocą 2 pętli to nic mądrego z tego nie wyjdzie.

#include <cstdio>

int main()
{
	int n;
	bool p;
	
	printf("Podaj koniec przedzialu: ");
	scanf("%d", &n);
	
	for(int i = 1; i < n + 1; i++)
	{
		p = true;
		
		for(int j = 2 ; j < i; j++)
			if( i % j == 0)
				p = false;
				
		if(p == true)
			printf("%d\n", i);
	}
}
0

Z postu autora wynika, że mają być to 2 pętle for i tylko 2, w sito są 3.

0

No dobra... wiem, że liczba 2 jest równocześnie parzysta i pierwsza..ale dlaczego skoro jest parzysta to jest pierwsza i skąd kompilator o tym wie?:D

0

w pierwszej petli rozwazasz liczby ktore masz w przedzilale, a w drugiej petli dzielisz dana liczbe przez kolejne liczby az dojdziesz do niej samej jezeli sie gdzies wczesniej podzieli zanim nie dojdziesz do tej wlasnie liczby to nie jest pierwsza

0

Czyli działa to tak:

2/2 = 0 ale jest pierwsza to wypisze...
3/2 = 1 wypisze
4/2 = 0 nie wypisze
5/2 = 1 wypisz
itd?
Czyli tak jakby w tej drugiej petli caly czas k = 2?

0

nie.
w drugiej petli rozwazasz liczby z predzilu z ktorego chcesz wypisac te liczby np od 0 do 100;
no i zalozmy sprawdzasz dla 23 no to dzielisz ja przez 2 daje reszty wiec git, potem przez 3 daje reszte git, potem przez 4 git(bo nie ma reszty), az w koncu dochodzisz do 23 i w kazdej poprzedniej dało reszte wiec jest pierwsza

0

Aaaah dobra już czaje.
Można zamknąć temat.

0

ohoho7 no źle.
23/4 = 5,75 czyli jest reszta.
Liczby pierwsze to są wtedy jak dzielą się tylko przez 1 i samą siebie a więc jakby 23/4 dawało bez reszty to przecież nie byłoby pierwszą... :P Mam racje?

0

tak w nawiasie sie pomylilem powinno byc ze daje reszte wiec git(a nie gdy brak reszty), tak jak wszedzie wczesniej, moja pomylka wynikajaca z pospiechu algorytm jest dobry

0

dobry powiadasz?
moje dwie pętelki na ideone.com potrzebowały 4.94 sekundy by policzyć, że jest 374 362 liczb pierwszych mniejszych od 5 400 000.
innym sposobem i też dwoma pętlami w 4.49 sekundy znalazłem 16 252 325 liczb pierwszych mniejszych od 300 000 000. <ort>DUifP tT8M3</ort>

0

z pewnością algorytm nie jest najwydajniejszy, wnioskuje po pytaniach założyciela tematu że wydajność nie jest dla niego ważna lecz jedynie samo to by program działał używając tylko 2 pętli.

0

w "drugim sposobie" zamiana char t[] na bitset<>t pozwoliła w czasie 4.93 sekundy doliczyć się 22 344 479 liczb pierwszych mniejszych od 420 000 000

Sposób Czas N
1 4.94 5 400 000
2 4.98 330 000 000
2 bitset 4.93 420 000 000
ciekawe ile kosztowałaby płyta główna z 4 GB pamięci cache.

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