Функция div() возвращает структуру, которая содержит фактор и остаток деления первого параметра (числитель) на второй (знаменатель). Есть четыре варианта:
div_t div(int, int)
ldiv_t ldiv(long, long)
lldiv_t lldiv(long long, long long)
imaxdiv_t imaxdiv(intmax_t, intmax_t
(intmax_t представляет наибольший целочисленный тип доступных в системе)
div_t
структура выглядит следующим образом:
typedef struct
{
int quot; /* Quotient. */
int rem; /* Remainder. */
} div_t;
Реализация просто использует операторы и %
, поэтому это не совсем сложная или необходимая функция, но она является частью стандарта C (как определено в [ISO 9899: 201x] [1]).
См реализацию в GNU LIBC:
/* Return the `div_t' representation of NUMER over DENOM. */
div_t
div (numer, denom)
int numer, 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;
}
Об этом уже было сказано в [этот вопрос] (http://stackoverflow.com/a/11726016/995714) –