Błąd wykoniania main.edu.pl

0

Mam pewien błąd wykonania przy 4 bądź 5 sprawdzanym przykładzie (wysyłałem parę razy i raz tu raz tu).

process exited due to signal 9 kod wyjścia: 2304

Kod dla poprzednich przykładów 100% poprawności.

Chciałbym widzieć tylko na czym polega ten błąd, z góry dziękuję.

0

Zapewne leci ci jakiś segfault.

0

Możliwe, że wychodzisz poza zakres tablicy. Ciężko cokolwiek więcej wywróżyć.

0

Mógłbyś wytłumaczyć na czym polega ten segfault.

W zadaniu nie wykorzystuje żadnych tablic, zadanie wygląda następująco:

  • wczytuje n dla ilości zestawów wejściowych
  • iteracja while(n--), w którym wczytuje dwie zmienne po czym wykonuje na nich obliczenia i wypisuje wynik
  • koniec
0
#include <iostream>
using namespace std;
 
int main(){
 
long long int n,kl,s,c,pom;
 
cin>>n;
 
while(n--){
    cin>>kl>>s;
    if(kl>s){
        pom=kl;
     while (s!=0){
        c = pom % s;
        pom = s;
        s = c;
    }
    cout<<(kl/pom)<<endl;  
    }
    else{
        pom=kl;
        while (pom!=0){
        c = s % pom;
        s = pom;
        pom = c;
    }
    cout<<(kl/s)<<endl;  
    }
    
    }
}
0

return 0 na końcu main?

0

Nie jest to obowiązkowe. Mimo wszystko poprawiłem i wynik jest identyczny.

0
  1. Naucz sie formatować kod jak człowiek
#include <iostream>
using namespace std;

int main()
{

    long long int n,kl,s,c,pom;
    cin>>n;
    while(n--)
    {
        cin>>kl>>s;
        if(kl>s)
        {
            pom=kl;
            while (s!=0)
            {
                c = pom % s;
                pom = s;
                s = c;
            }
            cout<<(kl/pom)<<endl;
        }
        else
        {
            pom=kl;
            while (pom!=0)
            {
                c = s % pom;
                s = pom;
                pom = c;
            }
            cout<<(kl/s)<<endl;
        }
    }
}
  1. A jakie są zakresy danych? Bo ja tu widze możliwe dzielenia przez 0
    Np. dla wejścia kl = 0, s = 0 masz dzielenie przez 0
0

Jak ja kocham tak nazwane zmienne, o tak jak mówić "sorry literki na klawiaturze mi się kończą, to na nazwanie zmiennych ich nie będę używać".
Kocham także taką ilość komentarzy - kod w końcu jest oczywisty.

A teraz analiza tego kodu równie pełna jak nazwy zmiennych i treściwa jak komentarze w nim (albo nawet i lepiej): masz błąd w logice zadań i własności wartości zmiennych po wykonaniu pętli. Wykonujesz na nich operacje bez sprawdzania czy wartości spełniają założenia operacji (dzielenie). Zdebuguj sobie operacje dzielenia (swoją drogą brawa za wykonywanie operacji w ten sposób).

0

Kod był pisany z pamięci więc wygląda tak a nie inaczej :D.

Dane wejściowe są zawsze większe niż jeden oraz mniejsze niż :
dla n < 1 000 000
dla kl i s < 1 000 000 000

0

Nie chce mi się nad tym dywagować, ale testowałeś ile to zabiera czasu dla granicznych danych, tzn dla miliona pesymistycznych przypadków? Bo może algorytm działa tak długo że main go zwyczajnie ubija po zacznym przekroczeniu czasu? To by nawet tłumaczyło sygnał 9 ;]

0

Zadanie dla mniejszych przykładów działa perfekcyjnie. Tylko przy większych ulega błędowi.
Pętla while to nic innego jak algorytm na największy wspólny dzielnik. Tu przepraszam bo rzeczywiście przydałyby się komentarze.
Ale miałem nadzieje że wiecie na czym polega wyświetlony błąd, więc nie będziecie wam potrzebny kod, który zbyt wiele nie pokazuje ;/

0

Ile trwa wykonanie na Twoim kompie dla pesymistycznego przypadku?

0

Mój gedit nie radzi sobie z 17mb tekstu.
http://ideone.com/zSe5ZJ

Możecie sami sprawdzić na ideone :D.

0

Pokaż link do tego zadania.

0

Udało mi się odpalić na moim komputerze przykład z gigantyczna ilością wejść dość długo wykonywał lecz błędu nie było i wyniki były poprawne.

0

Bo na Twoim komputerze nie masz ustawionych limitów czasu wykonania. Jeśli są ustawione (a być IMO powinny) to zabiją to co się za długo wykonuje.
A i zadanie ma ograniczenia, więc na bank czas wykonania również się liczy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1