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?

#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

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?

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.

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.
5

Liczba 20988936657440586486151265256610222593863921 nie jest liczbą pierwszą -> http://www.factordb.com/index[...]86486151265256610222593863921

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).
  9. #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;
      } 
0

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


int i=0;
int liczba[i]; 

może rodzic problemy....

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/i[...]86486151265256610222593863921

0

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

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