» Главная
eXcode.ru » Статьи » Алгоритмы » Арифметика
» Новости
» Опросы
» Файлы
» Журнал



Пользователей: 0
Гостей: 13





Окна пвх цены

Адреса выставочных залов. О заводе.

dokna.ru


Профнастил цена

Сайдинг и кровельные материалы. Торговый Дом - кровельные материалы.

mskstroydom.ru


Стабилизаторы напряжения трехфазные

Системы энергоснабжения.

aes.ru




Наибольший общий делитель двух целых чисел (алгоритм Евклида)




Наибольшим общим делителем (НОД) двух целых чисел называется такое наибольшее по модулю число, которое нацело делит эти два числа. По определению НОД(0,0)=0.

Данный алгоритм вычисления НОД двух целых чисел a и b состоит в следующем: если хотя бы одно из чисел равно нулю, то НОД(a,b)=|a+b|, в других случаях последовательно находятся остатки ri от делений:

a на b-a=bq1+r1,
b на r1-b=r1q2+r2,
r1 на r2-r1=r2q3+r3,
. . . . . .
и т.д., пока rn+1 не станет равно нулю. Тогда НОД(a,b)=НОД(b,r1)=НОД(r1 ,r2)=...=НОД(rn-1 ,rn )=rn.

А вот как этот алгоритм описан в книге Д.Э. Кнута "Искусство программирования".

1) [Проверка] Если a<b, то a<->b.

2) [Нахождение остатка] Разделим a на b, и пусть остаток от деления будет равен r (где 0<=r<b).

3) [Сравнение с нулем] Если r=0, то выполнение алгоритма прекращается; b - искомое значение.

4) [Замещение] Присвоить a<-b, b<-r и вернуться к шагу 1.


Моя реализация данного алгоритма на Паскале:

function nod(a,b: integer):integer;
begin
if a<b then begin
a := a xor b;
b := a xor b;
a := a xor b;
end;
while not ((a=0) or (b=0)) do
if a >= b then a := a mod b else b := b mod a;
if a = 0 then result := b else result := a;
end;
К началу статьи





Добавил: LedWormДата публикации: 2005-05-30 22:33:58
Рейтинг статьи:4.25 [Голосов 4]Кол-во просмотров: 9870

Комментарии читателей

Всего комментариев: 1

2006-04-11 19:30:48
Geo
Непонятна экномия на переменных при реализации обмена значений a <-> b. Это сбивает с толку. Не думаю, что выделение дополнительно четырех байт под временную локальную переменную для нормальной реализации обмена серьезно перегрузило бы систему. Если уж так хочется сэкономить, то можно было использовать для обмена предопределенную переменную Result (все равно она в начале процедуры не задействована).

В остальном, все нормально.
Ваше имя: *
Текст записи: *
Имя:

Пароль:



Регистрация

В какой обстановке Вы программируете?
.. с пивом и друзьями ночью
9% (16)
.. без пива, но с друзьями
2% (3)
.. с кофеваркой в обнимку
23% (40)
.. с мешком чего-нибудь хрустящего
15% (27)
.. один, но с Rammstein ..
51% (89)

Проголосовало: 175
Приходит хакер к психиатру:
- Док, помоги, у меня раздвоение виртуальной личности.
- Не понял, это как?
- Я со своего второго ника на третий E-Mailы начал получать.
Рейтинг: 8.7/10 (3)
Посмотреть все анекдоты

 
eXcode.ru » Статьи » Алгоритмы » Арифметика