Funkcja sprawdzająca czy liczba jest pierwsza

0

Witam!

Napisałam funkcję, sprawdzającą czy liczba jest pierwsza

bool czyPierwsza(int liczba)
{
	bool wynik = true;
	if ((liczba > 1) && (liczba % 2 == 1))
	{
		for (int proba = 3; proba <= sqrt(liczba); proba += 2)
		{
			if (liczba == 2)
			{
				break;
			}
			if (liczba % proba == 0)
			{
				wynik = false;
				break;
			}
		}
	}
	else
	{
		wynik = false;
	}

	return wynik;
}

int main()
{
	std::cout << "Podaj liczbę ";
	int liczba;
	std::cin >> liczba;

	if (liczba > 1)
	{
		std::cout << "Liczba " << liczba;
		if (czyPierwsza(liczba))
		{
			std::cout << " jest pierwsza";
		}
		else
		{
			std::cout << " jest złożona";
		}
		std::cout << std::endl;
	}
	else
	{
		std::cout << "Liczba powinna być większa niż 1" << std::endl;
	}

	system("pause");
    return 0;
}

Mam 2 pytania:

  1. Dlaczego ta funkcja uważa, że liczba 2 jest liczbą złożoną? Przecież sprawdzam ten warunek?
  2. Dlaczego po uruchomieniu programy zamiast polskich znaków powstają pytajniki?
0

Wędka zamiast ryby: CodeBlocks VisualStudio.
google: c++ debuger <twoje IDE>.
A rozchodzi się o pierwszy warunek i else.

Odnośnie 2: wszystko rozchodzi się o kodowanie znaków. Twój program używa innego kodowania znaków niż system.
Gdyby wszystko było UTF-8 to by działało, tak samo jakby wszystko było ustawione na Windows-1250 też by działało.

Dodanie std::locale::global({ "" }); na początku może (nie musi) pomóc.

0

Jak powyżej, dodam tylko, że można ten "naiwny" test, troszkę ulepszyć:

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

https://en.wikipedia.org/wiki/Primality_test

0

Odnośnie 1:
Warunek

if ((liczba > 1) && (liczba % 2 == 1))

oznacza: jeżeli liczba jest większa niż 1 i nieparzysta.
Liczba 2 nie spełnia go więc funkcja zwraca false.

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