Главная | Программирование | Ссылки | Мои программы | 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, Алексей Токарев