Остаток A*B/C
равен произведению остатков A/C
и B/C
по модулю C
снова.
// РЕДАКТИРОВАТЬ: Ups, не видел условия A<C
,B<C
.В этом случае попробуйте что-то вроде этого:
tmp = A;
for (var i = 1; i<=B; i++)
{
if (tmp + A == overflow || tmp + A >= C)
tmp -= C;
tmp += A;
}
Полученный tmp
должен быть искомым остатком.Это будет работать до тех пор, пока все входные данные будут положительными, и мы делаем это в подписанной ситуации.Возможно, это будет работать и для unsigned, хотя и не проверял.
Конечно, вам нужна какая-то необычная функция для проверки условия oveflow
.
Что касается частного, вы можете простооцените A/C
, а затем умножьте его на B
, не так ли?