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

[C++] Liczby pierwsze

Ostatnio zmodyfikowano 2012-01-13 20:15
Autor Wiadomość
SeaMonster131
Temat założony przez niniejszego użytkownika
[C++] Liczby pierwsze
» 2012-01-13 19:10:29
Witam ;)
Zacząłem sobie robić zadania z "Polskiego SPOJ'a", tak, żeby poćwiczyć. Napisałem 1. program, ale wyrzuca mi przekroczenie limitu czasu, dlatego, jeżeli ktoś robił/robi lub po prostu wie, jak powinny wyglądać tamtejsze zadania to może powie co mam źle? :)

C/C++
#include <cstdio>

int main()
{
    int il_testow, liczby[ 100000 ];
    bool pierwsze[ 100000 ];
   
    scanf( "%d", & il_testow );
   
    for( int i = 0; i < il_testow; i++ )
    {
        scanf( "%d", & liczby[ i ] );
        pierwsze[ i ] = true;
    }
   
    for( int i = 0; i < il_testow; i++ )
    {
       
        for( int x = 2; x < liczby[ i ]; x++ )
        {
            if( liczby[ i ] % x == 0 )
                 pierwsze[ i ] = false;
           
        }
       
        if( pierwsze[ i ] && liczby[ i ] >= 2 )
             printf( "\nTAK" );
        else
             printf( "\nNIE" );
       
    }
   
    return 0;
}

Podejrzewam, że może chodzić o wczytywanie tych liczb itd, ale jak to można wtedy inaczej zrobić?
Input

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

Dziękuję za każdą pomoc :)
P-48095
Drraven
» 2012-01-13 19:35:37
Może kwestia optymalizacji?
C/C++
#include <cstdio>

int main()
{
    int il_testow, liczby[ 100000 ];
    bool pierwsze[ 100000 ];
   
    scanf( "%d", & il_testow );
   
    for( int i = 0; i < il_testow; i++ )
    {
        scanf( "%d", & liczby[ i ] );
        pierwsze[ i ] = true;
       
        for( int x = 2; x < liczby[ i ]; x++ )
        {
            if( liczby[ i ] % x == 0 )
                 pierwsze[ i ] = false;
           
        }
       
        if( pierwsze[ i ] && liczby[ i ] >= 2 )
             printf( "\nTAK" );
        else
             printf( "\nNIE" );
       
    }
}

return 0;
}
Co prawda jeden for mniej, ale może jednak ?:D
P-48098
matoł115
» 2012-01-13 19:39:03
Proponuję nie lecieć z petlą do liczby tylko do pierwiastka z niej :) Możesz też spróbować Sito Eratostenesa.
Pozdrawiam
P-48099
SeaMonster131
Temat założony przez niniejszego użytkownika
» 2012-01-13 19:41:36
Ale po wpisaniu liczby od razu wypisuje się TAK / NIE. A według zadania - moim zdaniem - najpierw powinno podać się ilość testów a następnie liczby, potem każda liczba powinna zostać spr i program powinien dopiero wtedy wypisać TAK / NIE.

Na ideone.com czas wyniósł 0.01s (z danymi wejściowymi dla 3 liczb - 0.02s), więc to chyba wina tego, iż nie powinienem stosować scanf/cin itd, tylko wtedy w jaki sposób to zrobić? :) Na "sztywno" to troche bez sensu?
P-48100
matoł115
» 2012-01-13 19:46:36
Nie wiem jak jest na SPOJU, ale na wroc.pl zawsze piszę programy wczytujące przykład z testu i od razu wypisujący rozwiązanie.
Testy są wtedy akceptowane. Myślę, ze na SPOJU będzie podobnie bo brałem udział w High School Programing League i takie rozwiązania przechodziły.
:)
P-48102
SeaMonster131
Temat założony przez niniejszego użytkownika
» 2012-01-13 20:00:46
Hm.. no to zrobiłem tak:
C/C++
#include <cstdio>

int main()
{
    int ilTestow = 3;
    int liczby[ 3 ] = { 11, 1, 4 };
    bool pierwsze[ 3 ];
   
    for( int i = 0; i < ilTestow; i++ )
         pierwsze[ i ] = true;
   
    for( int i = 0; i < ilTestow; i++ )
    {
       
        for( int x = 2; x < liczby[ i ]; x++ )
        {
            if( liczby[ i ] % x == 0 )
                 pierwsze[ i ] = false;
           
        }
       
        if( pierwsze[ i ] && liczby[ i ] >= 2 )
             printf( "\nTAK" );
        else
             printf( "\nNIE" );
       
    }
   
    return 0;
}
Teraz czas wynosi 0.00 - 0.01, lecz jest "błędna odpowiedź" :P
P-48103
szyx_yankez
» 2012-01-13 20:10:38
Na ideone.com czas wyniósł 0.01s (z danymi wejściowymi dla 3 liczb - 0.02s)
Taa, tyle, że na spoj'u nie ma 2 danych testowych, często dziesiątki/setki.
Był niedawno taki sam temat, poszukaj...
P-48105
ison
» 2012-01-13 20:12:07
@SeaMonster131 co Ty żeś teraz najlepszego zrobił? ;D
dane masz wczytać z wejścia, najpierw ilość testów potem liczby, odpowiedzi możesz wypisywać 'na krzyż', wejście i wyjście traktowane są osobno, możesz wypisać odpowiedź dla 1 testu tuż po jego wpisaniu,
w Twoim pierwszym kodzie problem leży w tym, że program jest za wolny ;) ok, testowałeś dla 3 liczb, a spróbuj przetestować dla 100000 liczb. Twoim zadaniem jest znalezienie bardziej optymalnej metody na sprawdzanie czy dana liczba jest pierwsza.
P-48106
« 1 » 2
  Strona 1 z 2 Następna strona