1.9 整数除算で端数切り下げ(商+剰余)

整数除算で端数を切り下げた商と剰余を求める関数テンプレートです。long long 型等、標準でサポートされていない型に対応するには、それぞれ個別に特殊化してあげる必要があります。

template<class T>
typename xdiv_t<T>::type floor_with_rem(T dividend, T divisor)
{
  assert(divisor > 0);
  typename xdiv_t<T>::type result = std::div(dividend, divisor);
  if (result.rem < 0)
  {
    result.rem += divisor;
    --result.quot;
  }
  return result;
}

template<long L, long R>
struct ifloor_with_rem
{
  static const long quot = (L < 0 ? -((-L +R - 1) / R) : L / R);
  static const long rem = L - quot * R;
private:
  BOOST_STATIC_ASSERT(R > 0);
};

xdiv_t クラステンプレートについては、1.8 整数除算で端数切り上げ(商+剰余)を参照してください。


元ネタ
このエントリーを含むはてなブックマーク