если располагать таблицей простых чисел, то можно значительно ускорить выполнение функции getNODab, особенно для больших чисел
предположим у нас есть достаточно большая для наших нужд таблица простых чисел 1 2 3 5 7 11 13 17 ...
и реализованы функции
long FindNearestSimpleNumberNotGreaterThan(long a); // возвращает ближайшее к a простое число не большее a
long GetPrev(long p); //возвращает ближайшее предыдущее к p простое число
тогда
Код: Выделить всё
long getNODab(long a, long b)
{
long NOD = 1;
long p,c;
long maxp; //максимальное непроверенное число на предмет делятся ли на него a и b
c = min(a,b);
maxp = p = FindNearestSimpleNumberNotGreaterThan(c);}
do
{
if (a%p==0 && b%p==0)
{NOD*=p; a=a/p; b=b/p;c = min(a,b);
p = FindNearestSimpleNumberNotGreaterThan(c); p = min(p,maxp);}
else {p = GetPrev(p); maxp=p;}
}while(p>1);
return NOD;
}
хотя вообще лучше переделать цикл на проверку с начала простых чисел (двигаться в массиве простых чисел не по убыванию, а по возрастанию; не GetPrev(p), а GetNext(p) соотвественно использовать)
для большинства пар (a,b) быстрее будет работать
но переписывать неохота ..