Искусство программирования на языке сценариев командной оболочки


Программирование на языке сценариев командной оболочки - стр. 250


# Решето Эратосфена # Очень старый алгоритм поиска простых чисел.

# Этот сценарий выполняется во много раз медленнее # чем аналогичная программа на C.

LOWER_LIMIT=1 # Начиная с 1. UPPER_LIMIT=1000 # До 1000. # (Вы можете установить верхний предел и выше... если вам есть чем себя занять.)

PRIME=1 NON_PRIME=0

declare -a Primes # Primes[] -- массив.

initialize () { # Инициализация массива.

i=$LOWER_LIMIT until [ "$i" -gt "$UPPER_LIMIT" ] do Primes[i]=$PRIME let "i += 1" done # Все числа в заданном диапазоне считать простыми, # пока не доказано обратное. }

print_primes () { # Вывод индексов элементов массива Primes[], которые признаны простыми.

i=$LOWER_LIMIT

until [ "$i" -gt "$UPPER_LIMIT" ] do

if [ "${Primes[i]}" -eq "$PRIME" ] then printf "%8d" $i # 8 пробелов перед числом придают удобочитаемый табличный вывод на экран. fi

let "i += 1"

done

}

sift () # Отсеивание составных чисел. {

let i=$LOWER_LIMIT+1 # Нам известно, что 1 -- это простое число, поэтому начнем с 2.

until [ "$i" -gt "$UPPER_LIMIT" ] do

if [ "${Primes[i]}" -eq "$PRIME" ] # Не следует проверять вторично числа, которые уже признаны составными. then

t=$i

while [ "$t" -le "$UPPER_LIMIT" ] do let "t += $i " Primes[t]=$NON_PRIME # Все числа, которые делятся на $t без остатка, пометить как составные. done

fi

let "i += 1" done

}

# Вызов функций. initialize sift print_primes # Это называется структурным программированием.

echo

exit 0

# ----------------------------------------------- # # Код, приведенный ниже, не исполняется из-за команды exit, стоящей выше.

# Улучшенная версия, предложенная Stephane Chazelas, # работает несколько быстрее.

# Должен вызываться с аргументом командной строки, определяющем верхний предел.

UPPER_LIMIT=$1 # Из командной строки. let SPLIT=UPPER_LIMIT/2 # Рассматривать делители только до середины диапазона.




- Начало -  - Назад -  - Вперед -