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

Wyznaczanie ilości dzielników

Ostatnio zmodyfikowano 2014-11-12 10:56
Autor Wiadomość
Tomek_z_W11
» 2014-10-30 13:37:13
Ahaaaa, to wszystko jasne. Jak w pierwszym poscie napisales o tym zerze, to pomyslalem o czyms zupelnie innym :)

Czyli jak wprowadza 0, to przerywamy petle, oraz nie wyswietlamy od razu naszych podzielnikow, tylko je zapamietujemy. Wyswietlenie bedzie potem. Wrzucam poprawiony kod:



#include<iostream>

using namespace std;

int main()
{
    int i, j, licznik=0; //do petli, do zliczania dzielnikow

    int tablica_liczb[60002];
    int tablica_licznikow[60002];

    for(i=0; i<60002; i++) //petla idaca po wszystkich komorkach tablicy (od zera ro rozmiaru tablicy)
    {
        cin >> tablica_liczb;

        if(tablica_liczb==0) //jezeli dostaniemy na wejscie 0, to przerywamy petle i zapamietujemy ilosc wprowadzonych liczb
        {                       //zmienna 'i' bedzie to przechowywac;
            break;
        }
        for(j=1; j<=tablica_liczb/2; j++) //petla potrzebna do wylapania wszystkich dzielnikow, idziemy od 1, bo przez 0 nie mozna
        {                                    //dzielic, do tab_liczb/2, bo nie ma potrzeby isc do konca liczby, tzn:
            if(tablica_liczb%j==0)       //majac liczbe 18, nie znajdziemy dzielnika wiekszego od 9, oprocz 18, ten przypadek
            {                               //zostal uwzgledniony.
                licznik++; //zliczanie dzielnikow
            }
        }
        licznik++; //uwzglednienie przypadku, ze kazda liczba jest podzielna przez sama siebie

        tablica_licznikow=licznik; //zapamietanie licznikow
        licznik=0;
    }

    for(j=0; j<i; j++) //wyswietlamy liczniki w odpowiedniej kolejnosci.
    {
        cout << tablica_licznikow[j] << endl;
    }

return 0;
}
P-119677
Tomek_z_W11
» 2014-10-30 13:38:28
Ahaaaa, to wszystko jasne. Jak w pierwszym poscie napisales o tym zerze, to pomyslalem o czyms zupelnie innym :)

Czyli jak wprowadza 0, to przerywamy petle, oraz nie wyswietlamy od razu naszych podzielnikow, tylko je zapamietujemy. Wyswietlenie bedzie potem. Wrzucam poprawiony kod:



#include<iostream>

using namespace std;

int main()
{
    int i, j, licznik=0; //do petli, do zliczania dzielnikow

    int tablica_liczb[60002];
    int tablica_licznikow[60002];

    for(i=0; i<60002; i++) //petla idaca po wszystkich komorkach tablicy (od zera ro rozmiaru tablicy)
    {
        cin >> tablica_liczb;

        if(tablica_liczb==0) //jezeli dostaniemy na wejscie 0, to przerywamy petle i zapamietujemy ilosc wprowadzonych liczb
        {                       //zmienna 'i' bedzie to przechowywac;
            break;
        }
        for(j=1; j<=tablica_liczb/2; j++) //petla potrzebna do wylapania wszystkich dzielnikow, idziemy od 1, bo przez 0 nie mozna
        {                                    //dzielic, do tab_liczb/2, bo nie ma potrzeby isc do konca liczby, tzn:
            if(tablica_liczb%j==0)       //majac liczbe 18, nie znajdziemy dzielnika wiekszego od 9, oprocz 18, ten przypadek
            {                               //zostal uwzgledniony.
                licznik++; //zliczanie dzielnikow
            }
        }
        licznik++; //uwzglednienie przypadku, ze kazda liczba jest podzielna przez sama siebie

        tablica_licznikow=licznik; //zapamietanie licznikow
        licznik=0;
    }

    for(j=0; j<i; j++) //wyswietlamy liczniki w odpowiedniej kolejnosci.
    {
        cout << tablica_licznikow[j] << endl;
    }

return 0;
}
P-119678
Tomek_z_W11
» 2014-10-30 13:44:55
I jeszcze jedno. Mozna znacznie ograniczyc zuzywana pamiec. Zamienic tablice na liczbe wejsciowa:
No bo po co nam tablica z 60-ma tysiacami elementow int, skoro mozna jednego inta zrobic i go nadpisywac kolejnymi wejsciami w petli, trzymaj kod:


#include<iostream>

using namespace std;

int main()
{
    int i, j, licznik=0; //do petli, do zliczania dzielnikow

    int liczba_we;
    int tablica_licznikow[60002];

    for(i=0; i<60002; i++) //petla idaca po wszystkich komorkach tablicy (od zera ro rozmiaru tablicy)
    {
        cin >> liczba_we;

        if(liczba_we==0) //jezeli dostaniemy na wejscie 0, to przerywamy petle i zapamietujemy ilosc wprowadzonych liczb
        {                       //zmienna 'i' bedzie to przechowywac;
            break;
        }
        for(j=1; j<=liczba_we/2; j++) //petla potrzebna do wylapania wszystkich dzielnikow, idziemy od 1, bo przez 0 nie mozna
        {                                    //dzielic, do tab_liczb/2, bo nie ma potrzeby isc do konca liczby, tzn:
            if(liczba_we%j==0)       //majac liczbe 18, nie znajdziemy dzielnika wiekszego od 9, oprocz 18, ten przypadek
            {                               //zostal uwzgledniony.
                licznik++; //zliczanie dzielnikow
            }
        }
        licznik++; //uwzglednienie przypadku, ze kazda liczba jest podzielna przez sama siebie

        tablica_licznikow=licznik; //zapamietanie licznikow
        licznik=0;
    }

    for(j=0; j<i; j++) //wyswietlamy liczniki(podzielniki) w odpowiedniej kolejnosci.
    {
        cout << tablica_licznikow[j] << endl;
    }

return 0;
}
P-119680
mati1995g
Temat założony przez niniejszego użytkownika
» 2014-10-30 13:49:04
Niestety kod cały czas nie chce przejść procesu kompilacji na serwerze od konkursu.
P-119681
Tomek_z_W11
» 2014-10-30 13:57:38
Heh. Nawet sie nie kompiluje???

Jestes pewien, ze mozna to w c++ pisac?
P-119683
mati1995g
Temat założony przez niniejszego użytkownika
» 2014-10-30 14:03:07
Przecież w pierwszym poście masz mój program który jest w c++ i DZIAŁA !!! Tylko przy dwóch ostatnich testach program nie mieści się w limitach czasowych 0,6s. Wykonuje się w ok 0.9s.
P-119684
Tomek_z_W11
» 2014-10-30 14:10:38
Nie wiem jak Ci pomoc, ale jeszcze z czystej ciekawosci zapytam, po co Ci ta tablica booli w Twoim programie?
P-119685
mati1995g
Temat założony przez niniejszego użytkownika
» 2014-10-30 14:17:35
Sito Eratostenesa które znacznie przyspiesza wykonywanie całego programu ponieważ z góry wiesz, które liczb mają tylko 2 dzielniki (pierwsze). Do tablicy bool wczytujesz wszystkie liczby do 10.000.000 i zmieniasz wartość na true jeżeli nie jest liczba pierwszą. Tak zalecają przynajmniej organizatorzy konkursu aby zastosować ten algorytm.
P-119686
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona