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, botów: 0