Главная Программирование Ссылки Мои программы Software $$$-здесь !!!
Простые алгоритмы

 

Оглавление
Наибольший общий делитель
Наименьшее общее кратное
Эратосфеново решето
Поиск цвета в палитре

 

 

Наибольший общий делитель (НОД)
Алгоритм получения наибольшего общего делителя, называемый алгоритмом Евклида, изложил в своей знаменитой работе "Начала" Евклид (330-320 гг. до н.э.). Он остался едва ли не не самым популярным алгоритмом и в эпоху компьютеров. Для 2-х натуральных чисел находится наибольшее число, на которое оба числа делятся без остатка. Ниже приведены 2 варианта реализации данного алгоритма, рекурсивный - Листинг 1. и интеративный - Листинг 2.
int NOD(int x,int y)
{
   if(x==0) return y;
       else return NOD(y%x,x);
}

Листинг 1. Рекурсивный вариант.

int NOD(int x,int y)
{
   while(x!=0 && y!=0)
   {
      if(x>=y) x=x%y;
          else y=y%x;
   }
return x+y;
}

Листинг 2. Интеративный вариант.

Оглавление

Наименьшее общее кратное (НОК)
Для 2-х натуральных чисел ищется наименьшее число, которое делится без остатка на исходные числа. Наиболее просто реализовать этот алгоритм используя предыдущий (НОД).
int NOК(int x,int y)
{
   return x/NOD(x,y)*y;
}

Листинг 3. НОК.

Оглавление

Эратосфеново решето
Греческий математик Эратосфен (275 - 194 гг. до н.э.) предложил интересный метод нахождения простых чисел в интервале [2 ; n]. Он написал на папирусе, натянутом на рамку все числа от 1 до 1000 и прокалывал составные числа. Папирус стал как решето, которое "просеивает" составные числа, а простые оставляет. Поэтому такой метод называют Эратосфеновым решетом. Сначала вычеркиваем числа кратные 2-м, потом 3-м, 5-и, и т.д. В результате все не вычеркнутые числа - простые. Ниже проиллюстрирован этот метод.

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
2 3 x 5 x 7 x 9 x  11 x  13 x  15 x  17 x  19 x  21 x  23 x  25 x 
2 3 x 5 x 7 x x x  11 x  13 x  x  x  17 x  19 x  x  x  23 x  25 x 
2 3 x 5 x 7 x x x  11 x  13 x  x  x  17 x  19 x  21 x  23 x  x  x 
2 3 x 5 x 7 x x x  11 x  13 x  x  x  17 x  19 x  x  x  23 x  x  x 
. . .

Оглавление

Поиск цвета в палитре
Этот алгоритм Вам может понадобиться когда например нужно перекодировать картинку с одной палитры на другую. Для решения рассмотрим более простую задачу - нужно найти в некоторой палитре из n цветов, цвет максимально похожий на некоторый заданный цвет. Введем обозначения:
(R0,G0,B0) - цвет, аналог которого нужно найти в палитре.
(Ri,Gi,Bi) - i-тый цвет в палитре.
Различие цветов будем оценивать с помощью следующей функции:
fi = 30*(Ri-R0)^2+59*(Gi-G0)^2+11*(Bi-B0)^2.
Множители 30;59;11 - отражают различную чувствительность человеческого глаза к красному,зеленому и синему цветам соответственно. Далее мы поочереди перебираем все цвета палитры и ищем цвет, для которого fi принимает минимальное значение. Это и будет искомый цвет. Смотрите на Листинг 4.
// структуры
typedef struct RGB_type
{
char r,g,b;
} RGB;

typedef struct Pal_type
{
int n;   // число цветов в палитре
RGB* C;
} Pal;

// это подпрограмма поиска
// P - палитра
// С - цвет, который требуется найти
// Возвращаемое значение - индекс цвета в палитре
int FindColor(Pal *P,RGB *C)
{
   int i, fi, best_color, f_min=1000000;
   for(i=0;i<P->n,i++)
      {
      fi=30*(P->C.r-C->r)*(P->C.r-C->r)+
         59*(P->C.g-C->g)*(P->C.g-C->g)+
         11*(P->C.b-C->b)*(P->C.b-C->b);
      if(fi<f_min){best_color=i,f_min=fi;}
      }
   return(best_color);
}


Листинг 4. Поиск цвета.

Оглавление

 

Copyright(c) 1999 ASoft, Алексей Токарев