Tutorial



Whoops

Po kolejnych poprawkach:

#include <stdio.h>
int d,n,i;
int f[20001];

int main()
{
  scanf("%d\n",&d);
  while (d--)
  {
    scanf("%d\n",&n);
    f[0]=0; f[1]=1;
    for (i=2; i<=n; i++) f[i]=f[i-1]+f[i-2];
    printf("%d\n",f[n]%10000);
  }
  return 0;
}

Wysłanie takiego programu spowoduje, że Sprawdzarka zwróci ocenę:

Wrong Answer

Oznacza to, że program wykonał się prawidłowo i nie przekroczył dopuszczalnego czasu, ale dał złą odpowiedĽ. W tym przypadku wkradł się nam błąd w implementacji (poprawnego) algorytmu. Z pozoru wygląda wszystko dobrze, ale liczby Fibonacciego są bardzo duże i ich reprezentacja nie zmieści się w typie int, przez co "przekręca się licznik" i powstają bzdurne wartości (powinniście dowiedzieć się jakie ograniczenia mają poszczególne typy). Jeżeli nie chcecie pisać własnej obsługi dużych liczb (a pewnie nie chcecie), to wystarczy, że będziecie w tablicy f trzymać liczby Fibonacciego modulo 10000, zamiast pełne liczby i wykonywać operację modulo na samym końcu.

Ten konkretny błąd da się wykryć testując program na swoim stanowisku na danych z treści zadania. Często jednak będzie tak, że na danych z treści (które zazwyczaj są dość proste) Wasz program będzie działał poprawnie, a na testach na Sprawdzarce będzie dawał błędne wyniki. Zalecamy abyście przed wysłaniem rozwiązania do oceny przeprowadzili kilka własnych testów (choć i to nie zawsze pomaga). W razie znalezienia danych wejściowych, na których program działa Ľle, przydatnym narzędziem do wykrycia miejsca błędu może się okazać debugger, ale zalecamy też przemyślenie kodu programu. Możecie też wysłać program do wydrukowania, tak aby szukając błędów w swoim programie nie blokować komputera pozostałym członkom drużyny.

Uwaga! Wasz program może działać nieprawidłowo nie tylko dlatego, że popełniliście błąd w implementacji, ale także dlatego, że sam algorytm jest zły. Zamiast szukać błędu w kodzie, zastanówcie się, czy aby na pewno Wasz pomysł na rozwiązanie jest poprawny. Zastanówcie się też czy Wasz program będzie prawidłowo działał dla wszystkich możliwych przypadków szczególnych (np. najmniejszych możliwych liczb). Właśnie fakt, iż program myli się dla pewnych złośliwych/szczególnych danych jest jedną z częstszych przyczyn oceny Wrong Answer.