Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

SPOJ- liczby pierwsze

Ostatnio zmodyfikowano 2016-05-18 18:48
Autor Wiadomość
sparklemo7ion
Temat założony przez niniejszego użytkownika
SPOJ- liczby pierwsze
» 2016-05-14 16:19:38
Siemanko, mam problem z zadaniem w SPOJ a mianowicie z liczbami pierwszymi, link -> http://pl.spoj.com/problems/PRIME_T/
Kod:
C/C++
#include <iostream>
using namespace std;

int main()
{
    int ile_liczb;
    int pierwsza;
   
    cin >> ile_liczb;
    int liczby[ ile_liczb ];
   
    for( int a = 0; a < ile_liczb; a++ )
    {
        bool pierwsza = true;
       
        cin >> liczby[ a ];
        if( liczby[ a ] == 1 || liczby[ a ] == 0 )
        {
            cout << "NIE!" << endl;
            pierwsza = false;
            continue;
        }
       
        for( int i = 2; i < liczby[ a ]; i++ )
        {
           
            if( liczby[ a ] % i == 0 )
            {
                cout << "NIE!" << endl;
                pierwsza = false;
                break;
            }
           
        }
        if( pierwsza == true )
             cout << "TAK!" << endl;
       
    }
   
    return 0;
}
Test mi wyszedł tak jak ma być. Wszystkich liczb nie sprawdzę co prawda ale kilka razy testowalem i wszystkie wyniki były ok, a kompilator na SPOJu wywala błąd: "Błędna odpowiedź" co tu jest nie tak?
Wiem, że możnaby to było pewnie napisać w kilku linijkach no ale na razie moje 'umiejętności' pozwalają mi tylko na to :P
P-148193
mateczek
» 2016-05-14 16:38:50
1 nie ładuj w tablicę bo i po co. Sprawdzaj liczbę na bieżąco czy pierwsza!!!
C/C++
int liczby[ ile_liczb ]; //nie potrzebnie tablicujesz. J robisz to w zły sposób
//tablice dynamiczne na stosie to zły pomysł

2 sprawdzanie czy pierwsza ogranicz zakres
C/C++
//zamiast tak
for( int i = 2; i < liczby[ a ]; i++ )


//zrób tak:
     cin >> liczba; // nie tablicuj

for( int i = 2; i < sqrt( liczba ); i++ ) { //ogranicz zakres sprawdzania do pierwiastka z liczby.  Bo w czasie nie wyrobisz
    //skoro sprawdzasz liczbę 42 wystarczy że zrobisz 6*7; 7*6 nie musisz
    //tutaj sprawdzaj czy pierwsza !!!
}
P-148195
sparklemo7ion
Temat założony przez niniejszego użytkownika
» 2016-05-14 19:15:20
No rzeczywiście z poprzednim kodem nie zmieściłem się w czasie :P
Napisałeś, że tablicuję w zły sposob i tablice dynamiczne na stosie to zły pomysł.
Mógłbyś wytłumaczyć, dlaczego robię to w zły sposób i co to w tym przypadku jest ten "stos"?
Poprawka:
C/C++
#include <iostream>
#include <math.h>
using namespace std;

int main()
{
    int ile_liczb, liczba;
    int pierwsza;
    cin >> ile_liczb;
   
    for( int a = 0; a < ile_liczb; a++ )
    {
        bool pierwsza = true;
       
        cin >> liczba;
        if( liczba == 1 )
        {
            cout << "NIE!" << endl;
            pierwsza = false;
            continue;
        }
       
        for( int i = 2; i <= sqrt( liczba ); i++ )
        {
            if( liczba % i == 0 )
            {
                cout << "NIE!" << endl;
                pierwsza = false;
                break;
            }
           
        }
        if( pierwsza == true )
             cout << "TAK!" << endl;
       
    }
   
    return 0;
}

Czas już dobry, ale kompilator wywalił ten sam błąd co wcześniej :/
P-148204
pekfos
» 2016-05-14 19:22:09
Czas już dobry, ale kompilator wywalił ten sam błąd co wcześniej :/
O jaki czas chodzi, skoro program się nie kompiluje..?
P-148205
sparklemo7ion
Temat założony przez niniejszego użytkownika
» 2016-05-14 20:16:05
"Limit czasu wykonania programu: 5s".
Program się zapewne skompilował, ale SPOJ poinformował o błędnej odpowiedzi. Test wychodzi tak jak ma być.
P-148209
mateczek
» 2016-05-14 20:21:54
a wykrzykniki po "NIE" I "TAK" to skąd Ci się wzieły ?? dlaczego je wstawiłeś ??
P-148210
sparklemo7ion
Temat założony przez niniejszego użytkownika
» 2016-05-14 20:50:40
<facepalm> Czemu te wykrzykniki tak siedziały w mojej głowie to nie mam pojęcia.. Bez wykrzykników podziałało. Ale i tak wielkie dzięki bo pierwszy kod który tu wstawiłem i tak by nie przeszedł ze względu na zbyt duży czas wykonania :P
P-148212
mateczek
» 2016-05-14 21:15:54

Napisałeś, że tablicuję w zły sposób i tablice dynamiczne na stosie to zły pomysł.


bo nie znasz rozmiaru tablicy w czasie kompilacji i możesz przepełnić stos programu uszkodzić inne zmienne ogólnie wysypać program
P-148215
« 1 » 2
  Strona 1 z 2 Następna strona