Liczby pierwsze, zrozumienie algorytmu

0

Cześć wszystkim, czy ktoś pomoże zrozumieć jak działa sprawdzenie czy liczba jest pierwsza?
Tak wygląda kod, niżej napisze jak ja to analizowałem, dodam że moje rozumowanie nie sprawdza sie juz dla liczby = 4. :p

bool LiczbaPierwsza(unsigned uLiczba)
{
   if (uLiczba == 2) return true;

   for (unsigned i = 2; i <= sqrt(uLiczba); ++i)
   {
         if (uLiczba % i == 0)
               return false;
   }
   return true;
}

Idąc po kolei:
liczba 2: if przejmuje warunek, return true;
liczba 3: mijam if, wchodze do pętli - sqrt z 3 to ok 1,7, więc pętla nie wykona sie ani razu bo[ i=2 > 1,7 ]; return true;
liczba 4: mijam if, wchodze do pętli - sqrt z 4 to 2, więc pętla wykona się raz, i ++ z 2 na 3 przed instrukcją w pętli, 4%3 = 1 więc wychodze z pętli; return true???

1
Spark_of_hope napisał(a):

i ++ z 2 na 3 przed instrukcją w pętli

Inkrementacja odbędzie się po instrukcjach w pętli. Ogólnie, pętla for wygląda w C++ tak: for(instrukcja przed pierwszą iteracją; test przed każdą iteracją; instrukcja po każdej iteracji).

0

No tak, nawet wtedy to jest 4%2 = 2 czyli wychodzi ze liczba jest pierwsza, a nie jest

0

Spróbuj tak:

typedef unsigned long long int ull_int;

int naive_prime_test(ull_int n){
	if (n <= 3) return n > 1;
	else if ( (n % 2 == 0) || (n % 3 == 0) ) return 0;
	ull_int i = 5;
	while (i * i <= n){
		if (n % i == 0) return 0;
		i += 2;
	}
	return 1;
}

Najpierw <= 3, potem podzielność przez 2 i 3, dalej pętla od pięciu, już z pominięciem parzystych.

0

Dzięki, też sprobuje tej metody :)
Kq, faktycznie źle pomyślałem bo 4%2 daje 0, szybko pisałem i sie nie zastanowiłem, teraz to nabrało sensu:)

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