Operowanie liczbami zmiennoprzecinkowymi a typy danych
Ostatnio zmodyfikowano 2017-08-10 16:41
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: 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. |
|
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. |
|
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> |
|
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. |
|
« 1 » |