Re[4]: max(x, y) %= min(x, y)
От: rg45 СССР  
Дата: 13.04.07 14:13
Оценка: 6 (1)
Здравствуйте, Roman Odaisky, Вы писали:

RO>Еще по поводу min/max.


RO>Алгоритм Евклида можно записать так:

RO>
RO>unsigned gcd(unsigned x, unsigned y)
RO>{
RO>    while(x && y)
RO>    {
RO>        max(x, y) %= min(x, y);
RO>    }

RO>    return x + y;
RO>}
RO>

RO>Решил попробовать, осилят ли компиляторы заменить сей код эквивалентным, более эффективным и менее кратким:
RO>
RO>unsigned gcd(unsigned x, unsigned y)
RO>{
RO>    while(x && y)
RO>    {
RO>        if(x < y)
RO>        {
RO>            y %= x;
RO>        }
RO>        else
RO>        {
RO>            x %= y;
RO>        }
RO>    }

RO>    return x + y;
RO>}
RO>


Прошу прощения за оффтопик, но все же... При вычислении наибольшего общего делителя легко можно избежать лишних сравнений внутри цикла:
template<typename T> 
inline T gcd(T a, T b)
{
  while(b)
  {
    T t = b;
    b   = a % b;
    a   = t;
  }
  return a;
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
--
Справедливость выше закона. А человечность выше справедливости.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.