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; } |
|
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; } |
|
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; } |
|
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. |
|
Tomek_z_W11 |
» 2014-10-30 13:57:38 Heh. Nawet sie nie kompiluje???
Jestes pewien, ze mozna to w c++ pisac? |
|
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. |
|
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? |
|
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. |
|
1 « 2 » 3 |