6 / 6
Mar 2017

Witam programistów, jest to mój pierwszy post na tym forum :slight_smile:
Zadanie dla przypomnienia brzmi tak:

Sprawdź, które spośród danych liczb są liczbami pierwszymi

Input
n - liczba testów n<100000, w kolejnych liniach n liczb z przedziału [1..10000]

Output
Dla każdej liczby słowo TAK, jeśli liczba ta jest pierwsza, słowo: NIE, w przeciwnym wypadku.

Example
Input:
3
11
1
4

Output:
TAK
NIE
NIE

Mój program wygląda tak:

#include iostream  //nie moge na forum uzyc<>
#include cstdlib //nie moge na forum uzyc<>
using namespace std;

int main()
{
    int n;       //ilość operacji do wykonania

    cin>>n;
    if (n>100000) exit (0);
    for (int i=0; i<n;i++)
    {
int x;
    cin>>x;


    if  (((x%2)!=0)&&((x%5)!=0)&&((x%3)!=0)&&((x%7)!=0)&& x>1  )
    cout<<"TAK"<<endl;
    else if (x==2||x==5||x==3||x==7)
        cout<<"TAK"<<endl;
    else
        cout<< "NIE"<<endl;
    }


    return 0;
}

Jakimś cudem "sędzia" nie przyjmuje zadania. Nawet input dopracowałem żeby przerywał po liczbie n większej od 100000 :smile: Więc rozłożyłem już ręce bezradnie i wobec braku odpowiedzi tutaj uznam że po prostu sędzia się myli :blush:

  • created

    Mar '17
  • last reply

    Mar '17
  • 5

    replies

  • 1.2k

    views

  • 4

    users

Niech p będzie liczbą pierwszą >= 11, wtedy p*p oczywiście nie jest
liczbą pierwszą. Powyższy program twierdzi jednak co innego.

Dziękuję za odpowiedź będącą subtelną sugestią :slight_smile: Już ustosunkowałem się do problemu i znów wydaję mi się, że powinno działać chociaż sędzia twierdzi inaczej, ale tym razem pozostawię już tylko pokornie program do obejrzenia:

#include iostream
#include cstdlib
#include math.h

using namespace std;

int main()
{
    int n;       //ilość operacji do wykonania

    cin>>n;
    if (n>100000) exit (0);
    for (int i=0; i<n;i++)
    {
int x;
    cin>>x;


    if  (((x%2)!=0)&&((x%5)!=0)&&((x%3)!=0)&&((x%7)!=0)&& x>1 && ((sqrt(x)*sqrt(x))!=x) )
    cout<<"TAK"<<endl;
    else if (x==2||x==5||x==3||x==7)
        cout<<"TAK"<<endl;
    else
        cout<< "NIE"<<endl;
    }


    return 0;
}

może przeczytaj coś o liczbach pierwszych oraz o arytmetyce w komputerach

oraz sprawdź działanie twojego programu dla liczb: 11, 17, 53 - sprawdź to na ideone.com - bo wyniki mogą być różne w zależności od użytego kompilatora

Gdyby sprawdzanie "pierwszości" liczb było takie proste, to by nie miały zastosowania w algorytmach kryptograficznych.

Czyli w tym przypadku KISS/BUZI mnie zwiodło :frowning:
A tak na poważnie rzeczywiście na ideone nie działa dla podanych liczb. W moim kompilatorze (GNU GCC) było ok. Następnym razem wiem gdzie ewentualnie sprawdzać, dzięki.
Zdaję sobie sprawę że metodę wykorzystałem dość prymitywną (opartą na całkowitości integer), ale zacząłem programować dopiero parę dni temu. Wrócę do tego zadania za jakiś czas :slight_smile: