1 / 49
Nov 2015

Mam problem z kodem. Wygląda mi na dobry lecz kończy pracę zaraz po kompilacji. Proszę o jakąś pomoc/ sugestie.

include

using namespace std;

int main()
{
int y=0;

while (y==1)
{
    long int suma=0;
    long long int suma2;
     int x=0;

     while (x==1)
     {
         int a;

     cin>>a;

     if (a==0)
     {
         cout<<suma<<endl;
         x++;
     }

     else
        {
        suma+=a;
        }

     }

     suma2+=suma;
     
     if (suma==0)
     {
     cout<<suma2<<endl;
     y++;
     }

}

return 0;

}

Z góry dziękuję za pomoc.

  • created

    Nov '15
  • last reply

    Oct '18
  • 48

    replies

  • 3.6k

    views

  • 16

    users

  • 5

    likes

  • 9

    links

Oł nie zauważyłem tego confused ... Dziękuję za pomoc smile
Ps. Będę już wstawiał prawidłowo. smile

1 month later

Witam. Tak po jakimś czasie wszedłem sobie na SPOJ'a, aby porozwiązywać zadania i je popoprawiać ( w sensie szybkość algorytmów ). Niektóre udało mi się przyspieszyć do czasu 0.00. Niestety tutaj w tym, mimo iż zrobiłem najprościej jak się da, mam czas 0.13. Dodam jeszcze, że używałem obiektów cin i cout. Gdzieś słyszałem, że są one wolniejsze od funkcji wczytywania i wypisywania z języka C. Mógłby ktoś powiedzieć jak to przyspieszyć tymi funkcjami?

PS. Wiem, że był gdzieś taki wątek na starym forum, ale z tego co widzę to zostało już całkowicie usunięte.

Jest problem z maszyną, na którym stoi stare forum, wróci gdy naprawią ten problem. Według mnie swoje pytanie powinieneś napisać nie w wątku z zadaniem tylko w nowym. Dlatego krótko - tu masz "słynny: przykład od Rafała Nowaka ze starego forum: http://www.rafalnowak.pl/wiki/index.php?title=IO65
Jeśli to mało to poszukaj innych funkcji z przyrostkiem _unlocked albo spróbuj wczytać dane raz funkcją fread() i operować na wczytanym buforze.

4 months later

Witam ja również mam problem z tym zadaniem na początku gdy zrobiłem to na tablicach to dostałem bład wykonania SIGSEGV więc później zrobiłem to zadanie przy pomocy vectorów ale dostaje błąd że odpowiedź błędna. Zrobiłem to również przy pomocy wskaźników ale to samo... błędna odpowiedź. Mam również pytanie w jakiej kolejności system sprawdza czy zadanie jest AC bo to by na pewno pomogło w poszukiwaniu błędów. A poniżej kod:

edit: nie ma kodu

Jeżeli sumazestaw jest typu long long, to jakiego typu elementy powinien zawierać wektor?
Tak naprawdę, nie musisz zapuisywać tych wyników do tablicy-wektora, tylko w takim wypadku, od razu je wypisywać na stdout [ na zmianę czytasz i wypisujesz].
Jeżeli jednak zapisujesz, to chociaż poniższa linijka jest poprawna:

Powyższa linijka powinna, moim skromnym zdaniem wyglądać tak:
for (int i = 0; i < tab.size(); ++i) cout << tab[i] << endl;

Jeżeli umieszczasz tu kod, to oczyść go ze zbędnych komentarzy i pseudokomentarzy, a po AC skasuj.

Spoj sprawdza plik wzorcowy, z plikiem "wyprodukowanym" [przekierowanie do pliku stdout] przez twój program.

Domyślam się, skąd wynikło napisanie pętli w taki sposób, ale i tak kompilator, wydaje mi się, zrobi to t ak, aby obliczenis tab.size() było jednokrotne. Jeżeli używasz c++14, możesz taką pętlę zapisać np tak:
for (auto i : tab)
cout << i << endl;

lub
for (auto &i : tab)
cout << i << endl;

11 days later

Witam. Zrobiłem to zadanie lecz SPOJ wyrzuca mi błąd SIGSEGV wiem że związany jest z tym że przekroczyłem dozwoloną pamięć, ale nie wiem jak to jeszcze bardziej uprościć. Na ideone kod działa. Link do kodu : http://ideone.com/8wS6nC37 Z góry dziękuje za pomoc.

  1. Jeżeli nie uzyskałeś AC, to trudno to nazwać zrobieniem zadania.
  2. WIem, że nic nie wiem? Błąd związany jest [w tym wypadku], że sam sobie podcinasz gałąź na której siedzisz. Możesz zadeklarować tablicę int wielkości dwieście tysięcy i program się skompiluje i uruchomi bez problemu i bez zgrzytów i jęczenia. Gdy jednak deklarujesz tablicę wielkości 25 elementów - skąd u licha wziąłeś taką wartość?, to nie dziw się, że program Ci się wywala z błędem SIGSEGV - tych liczb jest wielokrotnie więcej niż 25. Czy te upraszczanie, to użycie short zamiast int, lub long long? W takim razie nie upraszczaj, tylko komplikuj swój program. Na ideonie działa? Dziwne. Ale w takim razie wklej tam takie same testy jakie są na SPOJ'u i zobacz czy też będzie działał, bo na takich mikroskopijnych danych, jakie tam wkleiłeś to nie dziwota, że działa.

A jeżeli chodzi o prawdziwe uproszczenie programu, to można całkowicie zrezygnować, z zapisywania wszystkiego do tablicy, a w zamian na bieżąco na zmiaę wczytywać, obliczać, wypisywać jeżeli trzeba i dalej wczytywać kolejne liczby.

PS
Pod zadaniem były komentarze-podpowiedzi - ale jak widać nie skorzystałeś - w takim razie są one tam [były] zbędne i niepotrzebne - więc je skasowałem.

1 year later

Witam, proszę o pomoc ponieważ kod wydaje mi się dobry, testy też wychodzą dobre a spoj wyrzuca mi Błędną odpowiedź.

include

using namespace std;
int suma, liczba, sumaG;
int main()
{
while(cin >> liczba)
{
if (liczba==0)
{cout << suma << endl;
sumaG+=suma;
if (suma==0)
cout << sumaG << endl;
suma=0;}
suma+=liczba;
}
return 0;
}

przychodzi admin do lekarza
admin: panie doktorze, ostatnio wątroba mnie boli, chyba nie działa prawidłowo
lekarz: co pan powie, a u mnie działa prawidłowo

czy ten dowcip może z czymś ci się kojarzy ?

PS: jaki wynik dostaniesz dla danych:

2 -2 3 -3 4 -4 0
7 -7 8 -8 0
0

Po każdym zestawie wyświetla dwa 0. Czyli w tym może być problem

6 months later

mnie bardzie ciekawi, jak można uzyskać czas powyżej 0,1 sekundy :slight_smile: - oczywiście bez wstawiania zbędnych instrukcji

bo program w C/C++ używający scanf() i printf() wykonuje się w 0.02 s
sądzę, że używając cin/cout będzie to około 0.06 s

Mój prastary kod z printf i scanf dał… 0,26 s :wink:

Ale to z okresu, kiedy byłem skłonny kopiować cudze kody AC by na własne oczy przekonać się, że to ja robię coś źle, a nie SPOJ oraz by móc oglądać lepsze od moich kody.

Albo 4 lata temu w ciągu 2 min utworzyłem zupełnie dziki kod ze scanfami i printfami, w co nie wierzę.

na iostream właśnie uzyskałem 0,1 a na cstdio pętla mnie pokonała

mój tez kiedyś tyle dał - ale dziś puściłem ponownie i jest 0,02 :slight_smile: