uForum.uz

uForum.uz (https://uforum.uz/index.php)
-   Pascal, Delphi & Builder (https://uforum.uz/forumdisplay.php?f=165)
-   -   Помоги решить задачки в Паскаль (https://uforum.uz/showthread.php?t=9103)

Timofeus 19.04.2013 19:51

Цитата:

Сообщение от Nadir Zaitov (Сообщение 887486)
Типа вы его специально создали, чтоб постебаться над "a:=a-b"?

Вы о чём?

Nadir Zaitov 20.04.2013 15:26

Оффтоп:
Цитата:

Сообщение от Timofeus (Сообщение 887505)
Вы о чём?

О том, что алгоритм крайне медленный. Брутфорс.

Vitaliy Fioktistov 20.04.2013 19:25

Пара красивых и быстрых алгоритмов)

Код:

//алгоритм Евклида через остатки
long Nod(long a, long b)
{
    while (a && b)
        if (a >= b)
          a %= b;
        else
          b %= a;
    return a | b;
}
 
// Алгоритм Евклида через разности
long Nod(long a, long b)
{
    while (a && b)
        if (a >= b)
          a -= b;
        else
          b -= a;
    return a | b;
}

И совсем уж непонятныйкомпактный:
Код:

int Nod( int a, int b )
{
  while( b^=a^=b^=a%=b );
  return a;
}


Nadir Zaitov 22.04.2013 11:02

Цитата:

Сообщение от Vitaliy Fioktistov (Сообщение 887663)
Код:

{
    while (a && b)
        if (a >= b)
          a %= b;
        else
          b %= a;
    return a | b;
}


Я такой же алгоритм нарисовал. Также использовать идею с "и" и "или", только в нотации умножения и сложения. Конечно с использованием логики красивее, согласен.

А непонятный не разобрал.

German Stimban 22.04.2013 11:58

Цитата:

Сообщение от Nadir Zaitov (Сообщение 887940)
Я такой же алгоритм нарисовал. Также использовать идею с "и" и "или", только в нотации умножения и сложения. Конечно с использованием логики красивее, согласен.

"Ифы" замедляют работу программы.
Я предпочитаю запускать функцию с заранее гарантированным неравенством a>=b и не париться с проверками каждую итерацию - проще проверить условие перед вводом данных в функцию.

Nadir Zaitov 22.04.2013 12:35

Цитата:

Сообщение от German Stimban (Сообщение 887956)
"Ифы" замедляют работу программы.

Так "лупы" те же "ифы". Заменять "ифы" лишними "лупами" бессмысленно. Или вы как хотели? Можете более быстрый вариант расписать?

German Stimban 22.04.2013 12:50

Цитата:

Сообщение от Nadir Zaitov (Сообщение 887969)
Так "лупы" те же "ифы". Заменять "ифы" лишними "лупами" бессмысленно. Или вы как хотели?

Сорри, криво посмотрел на код.
Если использовать рекурсию вместо цикла, будет чуть попроще в решении. Однако, рекурсия несёт и свои минусы.

Vitaliy Fioktistov 22.04.2013 16:11

Цитата:

Сообщение от Nadir Zaitov (Сообщение 887940)
Цитата:

Сообщение от Vitaliy Fioktistov (Сообщение 887663)
Код:

{
    while (a && b)
        if (a >= b)
          a %= b;
        else
          b %= a;
    return a | b;
}


Я такой же алгоритм нарисовал. Также использовать идею с "и" и "или", только в нотации умножения и сложения. Конечно с использованием логики красивее, согласен.

А непонятный не разобрал.

Он при всей своей вырвиглазности, тем не менее работает). Правда, на Паскаль его из C++ вряд ли удастся настолько же красиво портировать)

Nadir Zaitov 22.04.2013 18:29

Цитата:

Сообщение от Vitaliy Fioktistov (Сообщение 887663)
Код:

int Nod( int a, int b )
{
  while( b^=a^=b^=a%=b );
  return a;
}


Разобрался. Тут с помощью ряда xor реализована команда обмена данными между a и b.
Также красиво в Паскале не написать, но будет похоже. Я пишу в нотации сумм, а не xor, чтобы был "как бы" другой алгоритм :))
Код:

function NOD(a,b: integer):integer;
var a,b,:integer;
  Begin
    Repeat
        a:=a mod b;
        a:=a+b;
        b:=a-b;
        a:=a-b;
    Until b=0;
    NOD:=a;
  End;



Текущее время: 16:00. Часовой пояс GMT +5.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd. Перевод: zCarot
OOO «Единый интегратор UZINFOCOM»