Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Operowanie liczbami zmiennoprzecinkowymi a typy danych

Ostatnio zmodyfikowano 2017-08-10 16:41
Autor Wiadomość
e5500
Temat założony przez niniejszego użytkownika
Operowanie liczbami zmiennoprzecinkowymi a typy danych
» 2017-08-10 14:48:09
Witam! Robiąc dziś zadanie ze spoja natrafiłem na taki problem. Mianowicie, w pewnym momencie wykonywania programu należało podzielić przez siebie dwie liczby całkowite, a wynik takiego działania nie zawsze był całkowity. Należało zaokrąglić go w górę. Robiąc to w przykładowo taki sposób:
C/C++
int a, b;
cin >> a >> b;
float c = a / b;
cout << c;

Otrzymywałem wynik obcięty z "cyfr po przecinku", czyli zaokrąglony w dół. Próbowałem również dodawać do działania 0.9, ale to oczywiście nic nie dawało, ponieważ na etapie zakończenia dzielenia wartość ta jest już float, więc zamiast zaokrąglenia mamy wartość z ".9" po przecinku. Robiąc to na int również nic nie byłem w stanie wskórać.
Koniec końców, zadeklarowałem wszystkie zmienne używane w działaniu (a, b, c) jako zmiennoprzecinkowe oraz skorzystałem z funkcji floor() i ceil() z biblioteki math.h.
Osiągnąłem zamierzony efekt, lecz mam wrażenie, że zrobiłem to na skróty. Czy jest ktoś w stanie przedstawić sprytniejszy sposób, bez używania dodatkowych funkcji?
Z góry gorąco dziękuję za wszystkie odpowiedzi.
P-163894
Kinexity
» 2017-08-10 15:33:15
Po to są funkcje zaokrąglające, żeby z nich korzystać. Nie wiem jak inaczej miałbyś to zrobić bez nich (pomijam napisanie ich samemu). Nie wiem po co ten temat skoro problem był z góry rozwiązany.

EDIT: Tak w ogóle to SPOJ nie ocenia, jak sprytnie rozwiążesz dane zadanie, lecz czy je rozwiążesz.
P-163895
Monika90
» 2017-08-10 15:33:49
Jeżeli a i b są nieujemne i ich suma nie przekracza INT_MAX to wystarczy (a + b - 1) / b

W C++ używaj <cmath> zamiast <math.h>
P-163896
garlonicon
» 2017-08-10 16:41:42
Najlepiej zrobić to na zmiennych całkowitoliczbowych. Sprawdzasz resztę z dzielenia i jeśli jest niezerowa, to dodajesz jeden do wyniku dzielenia.
P-163898
« 1 »
  Strona 1 z 1