#include <iostream>
#include <cstdlib>
div_t
divide (int numer, int denom)
{
div_t result;
result.quot = numer / denom;
result.rem = numer % denom;
/* The ANSI standard says that |QUOT| <= |NUMER / DENOM|, where
NUMER / DENOM is to be computed in infinite precision. In
other words, we should always truncate the quotient towards
zero, never -infinity. Machine division and remainer may
work either way when one or both of NUMER or DENOM is
negative. If only one is negative and QUOT has been
truncated towards -infinity, REM will have the same sign as
DENOM and the opposite sign of NUMER; if both are negative
and QUOT has been truncated towards -infinity, REM will be
positive (will have the opposite sign of NUMER). These are
considered `wrong'. If both are NUM and DENOM are positive,
RESULT will always be positive. This all boils down to: if
NUMER >= 0, but REM < 0, we got the wrong answer. In that
case, to get the right answer, add 1 to QUOT and subtract
DENOM from REM. */
if (numer >= 0 && result.rem < 0)
{
++result.quot;
result.rem -= denom;
}
return result;
}
int main()
{
int num = -42, div = 5;
std::div_t res = divide(num, div);
std::cout << "Result: " << res.quot << ":" << res.rem << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGxpYj4KZGl2X3QKZGl2aWRlIChpbnQgbnVtZXIsIGludCBkZW5vbSkKewogICAgZGl2X3QgcmVzdWx0OwoJcmVzdWx0LnF1b3QgPSBudW1lciAvIGRlbm9tOwoJcmVzdWx0LnJlbSA9IG51bWVyICUgZGVub207CgkvKiBUaGUgQU5TSSBzdGFuZGFyZCBzYXlzIHRoYXQgfFFVT1R8IDw9IHxOVU1FUiAvIERFTk9NfCwgd2hlcmUKCSAgIE5VTUVSIC8gREVOT00gaXMgdG8gYmUgY29tcHV0ZWQgaW4gaW5maW5pdGUgcHJlY2lzaW9uLiAgSW4KCSAgIG90aGVyIHdvcmRzLCB3ZSBzaG91bGQgYWx3YXlzIHRydW5jYXRlIHRoZSBxdW90aWVudCB0b3dhcmRzCgkgICB6ZXJvLCBuZXZlciAtaW5maW5pdHkuICBNYWNoaW5lIGRpdmlzaW9uIGFuZCByZW1haW5lciBtYXkKCSAgIHdvcmsgZWl0aGVyIHdheSB3aGVuIG9uZSBvciBib3RoIG9mIE5VTUVSIG9yIERFTk9NIGlzCgkgICBuZWdhdGl2ZS4gIElmIG9ubHkgb25lIGlzIG5lZ2F0aXZlIGFuZCBRVU9UIGhhcyBiZWVuCgkgICB0cnVuY2F0ZWQgdG93YXJkcyAtaW5maW5pdHksIFJFTSB3aWxsIGhhdmUgdGhlIHNhbWUgc2lnbiBhcwoJICAgREVOT00gYW5kIHRoZSBvcHBvc2l0ZSBzaWduIG9mIE5VTUVSOyBpZiBib3RoIGFyZSBuZWdhdGl2ZQoJICAgYW5kIFFVT1QgaGFzIGJlZW4gdHJ1bmNhdGVkIHRvd2FyZHMgLWluZmluaXR5LCBSRU0gd2lsbCBiZQoJICAgcG9zaXRpdmUgKHdpbGwgaGF2ZSB0aGUgb3Bwb3NpdGUgc2lnbiBvZiBOVU1FUikuICBUaGVzZSBhcmUKCSAgIGNvbnNpZGVyZWQgYHdyb25nJy4gIElmIGJvdGggYXJlIE5VTSBhbmQgREVOT00gYXJlIHBvc2l0aXZlLAoJICAgUkVTVUxUIHdpbGwgYWx3YXlzIGJlIHBvc2l0aXZlLiAgVGhpcyBhbGwgYm9pbHMgZG93biB0bzogaWYKCSAgIE5VTUVSID49IDAsIGJ1dCBSRU0gPCAwLCB3ZSBnb3QgdGhlIHdyb25nIGFuc3dlci4gIEluIHRoYXQKCSAgIGNhc2UsIHRvIGdldCB0aGUgcmlnaHQgYW5zd2VyLCBhZGQgMSB0byBRVU9UIGFuZCBzdWJ0cmFjdAoJICAgREVOT00gZnJvbSBSRU0uICAqLwoJaWYgKG51bWVyID49IDAgJiYgcmVzdWx0LnJlbSA8IDApCgkJewoJCQkrK3Jlc3VsdC5xdW90OwoJCQlyZXN1bHQucmVtIC09IGRlbm9tOwoJCX0KCXJldHVybiByZXN1bHQ7Cn0KCmludCBtYWluKCkKewoJaW50IG51bSA9IC00MiwgZGl2ID0gNTsKCXN0ZDo6ZGl2X3QgcmVzID0gZGl2aWRlKG51bSwgZGl2KTsKCXN0ZDo6Y291dCA8PCAiUmVzdWx0OiAiIDw8IHJlcy5xdW90IDw8ICI6IiA8PCByZXMucmVtIDw8IHN0ZDo6ZW5kbDsKCn0K