12 / 12
Jun 2017

Witam, mam problem, stworzyłem program, jako odpowiedź na zadanie http://pl.spoj.com/problems/JROWLIN/22
Jednak mimo, że wpisując dowolne przykłady do konsoli odpowiedzi są zgodne z prawdą, jednak sędzia odrzuca moją odpowiedź, czy ktoś mógłby powiedzieć, gdzie robię błąd?
1. #include
2. #include

  1. using namespace std;

  2. int main()

  3. {
  4. double a,b,c,wynik;
  5. cin>>a>>b>>c;
  6. (round(100*(a))/100) ;
  7. (round(100*(b))/100) ;
  8. (round(100*(c))/100) ;
  9. if (a==0 && b!=c) cout<<"BR"<<endl;
  10. else if( a==0 && b==c) cout<<"NWR"<<endl;
  11. else
  12. {
  13. wynik=(c-b)/a;
  14. cout << (round(100*(wynik))/100) << endl;

  15. }

  16. return 0;

  17. }
  • created

    Jun '17
  • last reply

    Jun '17
  • 11

    replies

  • 1.4k

    views

  • 3

    users

  • 3

    links

Tu chyba coś ucieło !

  • Zaokrągla się wyniki na końcu - tuż przed wypisywaniem na wyjście .
  • round - służy do zaokrąglania do NAJBLIŻSZEJ liczby całkowitej .

Edit :
Liczby zmiennoprzecinkowe działają z pewną dokładnością - dokładność maleje wraz ze zwiększaniem się liczby . Opis jak są repezentowane w pamięci komputera https://pl.wikipedia.org/wiki/Liczba_zmiennoprzecinkowa#Implementacje_sprz.C4.99towe4 .
Przy 8 ( typ float ) lub 16 ( typ double ) cyfrach znaczących nie ma repezentowanie tego co jest po przecinku . Co gorszą - przy większych liczbach nie da się nawet reprezentować wszystkich liczb całkowitych . Np liczba 16 cyfrowa będą mogły być repezentowane co druga ( parzyste )

Załóżmy że autor zadania dał liczbę o 14 cyfrach przed przecinkiem i 2 po przecinku .
Ty mnożysz tą liczbę i jest 50 procent szans że po przemożeniu będzie ona przekłamana ( błąd obliczenia ) .
Np : 12345678901234.55 * 100 da wynik 1234567890123456 . Po podzieleniu przez 100 otrzymasz 12345678901234.56 - a więc już dla sędziego to będzie błędny wynik .

Z tego wynika, że należałoby zmienić typ zmiennych, tylko, że nie za bardzo wiem, na jaki, jeśli to nie double i nie float. Ponadto w treści zadania było napisane, że już wprowadzone liczby są zaokrąglone dlatego dałem taki zapis :smiley: Proszę o więcej wskazówek, bo jestem jeszcze dość zielony :slight_smile:

Ja robiłem na long double. Niemniej właśnie wysłałem double (AC) i float (AC). Double powinno wystarczyć.

EDIT
Podejrzewam, że masz zły algorytm albo złą jego realizację w kodzie. Zadanie jest w łatwych i jest jednym z najprostszych na SPOJu (http://pl.spoj.com/ranks/JROWLIN/). Stąd wątpię, aby ktoś Ci pomógł - na tym poziomie błąd w kodzie jest właściwie równoważny błędnemu algorytmowi. A przecież nie o to chodzi by ktoś podał Ci gotowca :wink: Czytaj: z tym problemem najpewniej musisz sobie poradzić samemu.

Nikt mi nie pomagał, dopiero zaczynam z programowaniem i nie oczekuje gotowców. Po prostu nie widzę problemu w kodzie, bo na przykłady odpowiada prawidłowo. No nic popróbuję, a jak nie znajdę błędu to uznam, że działa tak ogólnie dla pewnej grupy przypadków i zostanie na dysku :smiley:

Ponadto rozumiem już, odkryłem, że sędzia pokazuje błąd. Problem polega, że mój kod nie pokazuje dwóch zer po przecinku, gdy liczba jest całkowita. Szukałem w googlach i nie znalazłem zadowalającej i jasnej odpowiedzi :confused:

Jeszcze dodam, że spróbowałem dopisać zwyczajnie zera, dla warunku, gdy różnica między liczbą a jej cechą jest równa 0, ale sędzia nie dał się nabrać.

cout.precision( jakas_wartosc );

Daj na ideone.com kod jaki masz ( i podjaj linka do kodu ) .

cout.precision(2);
cout << fixed << wynik << endl;

Edit :
Wrzuciłem twój kod na spoja z poprawkami co do wypisywania ilości znaków po przecinku i przeszedł ( c++ 14 )

dziękuję Ci bardzo, w zasadzie ten sposób od razu prostuje wszystkie moje rozważania odnośnie również innych programów ze spoja :slight_smile:
tak więc, dziękuję jeszcze raz :smiley: