SPOJ oszukuje mówiąc, że odpowiedź jest błędna.

SPOJ oszukuje mówiąc, że odpowiedź jest błędna.
0

Oto kod sprawdzający, czy liczba jest liczbą pierwszą. Testowałem go z naprawdę wielkimi liczbami pierwszymi takimi jak 20988936657440586486151265256610222593863921 i wszystko się zgadzało, lecz SPOJ cały czas podaje komunikat o błędnej odpowiedzi. Wyjaśni mi ktoś dlaczego?

Kopiuj
#include <iostream>

using namespace std;
int n;
int main()
{
    cin >> n;
    int A[n];
    int i=0;
    int liczba[i];

    while(i<n)
    {
    cin >> liczba[i];
    i++;
    }
i=0;
    while(i<n)
    {



     A[i]=0;
    int x=2;
    while(x<liczba[i])
        {
        if(liczba[i]%x==0&&liczba[i]!=2)
            {
            A[i]++;
            }
        x++;
        }
        i++;
    }

    i=0;

    while(i<n)
    {
    if(liczba[i]==0)
    cout<<"NIE"<<endl;
    else if(liczba[i]==1)
    {
    cout<<"NIE"<<endl;
    }
    else if(A[i]==0)
    cout<<"TAK"<<endl;
    else
    cout<<"NIE"<<endl;
    i++;
    }


    return 0;
}
 

Z góry dzięki za pomoc

stryku
  • Rejestracja:ponad 11 lat
  • Ostatnio:prawie 2 lata
  • Postów:607
3

:)

Nie wiem jakim cudem Ci to przechodziło wszystkie testy. Chyba, że testowałeś to tylko jedną liczbą, tą co podałeś, i akurat (prawie cudem) się złożyło, że zadziałał.

Przecież w incie przeważnie zmieścisz liczbę max ~2mld, a Ty tu wyskakujesz z takimi potworami. Int ma za mały zakres na takie liczby. Co tam int. unsigned, unsigned long long, a nawet long double pewnie nie pomieści liczb z testów ze spoja. Musisz stworzyć własne coś do operowania na bardzo dużych liczbach.

Nie wiem też jaki zakres mają liczby z testów. Może mieszczą się w jakimś prymitywnym typie. Jaki jest zakres?

EDIT
Poza tym to nie jest kod C++. VLA?

A to to co?

Kopiuj
int i=0;
    int liczba[i];
 
    while(i<n)
    {
    cin >> liczba[i];
    i++;
    }

przecież piszesz poza tablicę.

I ostatnia sprawa. Wg mnie ten kod jest nieoptymalny i nawet jak poprawisz te potworki to nie przejdzie testów czasowych.

edytowany 2x, ostatnio: stryku
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Szczecin
6
  1. int A[n]; C++ nie ma VLA
  2. fatalne formatowanie kodu
  3. Gdzie niby obsługujesz wielkie liczby? Na większości architektur int ma zakres -231 do 231-1
  4. Po co zapisujesz liczby do tablicy gdy tylko masz sprawdzić czy są pierwsze czy nie?!
  5. Masz UB i to twój kod oszukuje, że 2147483659 nie jest pierwszą, gdy jest http://melpon.org/wandbox/permlink/pRsfip2RJHAm1vi
  6. A[i]=0; zerujesz przed pętlą, dla pozostałych wartości masz UB.
  7. Skasuj to i napisz od nowa. Polecam wydzielić sprawdzanie do osobnej funkcji isPrime.

edytowany 3x, ostatnio: kq
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
5

Liczba 20988936657440586486151265256610222593863921 nie jest liczbą pierwszą -> http://www.factordb.com/index.php?query=20988936657440586486151265256610222593863921


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 2x, ostatnio: Shalom
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 8 godzin
5
CzikaCarry napisał(a):

Testowałem go z naprawdę wielkimi liczbami pierwszymi takimi jak 20988936657440586486151265256610222593863921 i wszystko się zgadzało...

  1. Doprawdy? http://ideone.com/rZvWZ6
  2. Zapoznaj się z pojęciem formatowania kodu: http://4programmers.net/Forum/998482
  3. Zlikwiduj smrodek przy inkementacji: http://4programmers.net/Forum/1101404
  4. int A[n]; - to zadziała tylko pod jednym kompilatorem, standard nie gwarantuje że to zadziała.
  5. Czy próbowałeś kiedyś zmierzyć obiekt metrem krawieckim, po czym rozciągać metr krawiecki celem wydłużenia mierzonego obiektu? Nie? To czemu myślisz że to int i=0; int liczba[i]; ma zadziałać?
  6. Po kiego zliczasz ilość dzielników? Wpisz A[i]=true; i natychmiast break; bo niby po kiego kontynuować?
  7. Zamiast litanii if'ów przy każdej liczbie zrób A[0]=A[1]=true;
  8. Po wczytaniu listy, znajdź maksymalną wartość, zbuduj sito Eratostenesa, do tej wartości (albo od razu dla maksymalnej zadanej wartości).
Kopiuj
    #include <iostream>
    using namespace std;
     
    int main()
      {
       unsigned i,k,T,X;
       static bool Tb[10001]={true,true};
       ios_base::sync_with_stdio(false);
       cin.tie(0);
       for(i=2;i<=100;++i) if(!Tb[i]) for(k=i*i;k<10001;k+=i) Tb[k]=true; // budujemy sito
       for(cin>>T;T--;cout<<(Tb[X]?"NIE\n":"TAK\n")) cin>>X; // wczytujemy i wyświetlamy wyniki
       return 0;
      } 

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 3x, ostatnio: _13th_Dragon
kaczus
  • Rejestracja:około 10 lat
  • Ostatnio:7 dni
  • Lokalizacja:Łódź
  • Postów:1402
0

Ktoś już napisał, że w C++ nie ma VLA, dodatkowo:

Kopiuj

int i=0;
int liczba[i]; 

może rodzic problemy....


Ogólnie na prace domowe mam stawki zaporowe. Czasem coś o programowaniu znajdzie się na mojej stronie
_13th_Dragon
pkt 5. w poście wyżej ;P
kaczus
Jak pisałem posta wyżej nie było jeszcze :)
_13th_Dragon
Ja raczej o tym, że inaczej to ująłem :)
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:10 minut
0
CzikaCarry napisał(a):

Testowałem go z naprawdę wielkimi liczbami pierwszymi takimi jak 20988936657440586486151265256610222593863921 i

To NIE JEST liczba pierwsza jest podzielna przez 193!
http://www.wolframalpha.com/input/?i=20988936657440586486151265256610222593863921


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
pingwindyktator
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Kraków
  • Postów:1055
0

20988936657440586486151265256610222593863921 to nie jest naprawde duża liczba, tak btw.


do not code, write prose
bogdans
Tak btw. żadna liczba nie jest naprawdę duża, dla każdej liczby dodatnie n ilość liczb od niej większych jest znacznie większa niż ilość liczb dodatnich od niej mniejszych :).
pingwindyktator
Mówię o liczbach wykorzystywanych w IT (choćby kryptografia). Tam na porządku dziennym są liczby rzędu 2^16000

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.