У меня есть следующий рабочий код:
largest_prime=1
for number_under_test in {1..100}
do
is_prime=true
factors=''
for ((divider = 2; divider < number_under_test-1; divider++));
do
remainder=$(($number_under_test % $divider))
[ $remainder == 0 ] && [ is_prime ] && is_prime=false && factors+=$divider' '
done
[ $is_prime == true ] && echo "${number_under_test} is prime!" || echo "${number_under_test} is NOT prime (factors= $factors)" [ $is_prime == true ] && largest_prime=$number_under_test
done
printf "\nLargest Prime= $largest_prime\n"
Этот код работает быстро составляет 0,194 секунды. Тем не менее, я обнаружил, что && is_prime= false
текст немного сложен для чтения, и это может показаться (неопытному глазу), как будто его тестируют, а не устанавливают, что и делает. Так что я попытался изменить &&
в if...then
и это работает - но в 75 раз медленнее на 14,48 секунд. Это наиболее заметно на старших цифрах.
largest_prime=1
for number_under_test in {1..100}
do
is_prime=true
factors=''
for ((divider = 2; divider < number_under_test-1; divider++));
do
remainder=$(($number_under_test % $divider))
if ([ $remainder == 0 ] && [ $is_prime == true ]); then
is_prime=false
factors+=$divider' '
fi
done
[ $is_prime == true ] && echo "${number_under_test} is prime!" || echo "${number_under_test} is NOT prime (factors= $factors)" [ $is_prime == true ] && largest_prime=$number_under_test
done
printf "\nLargest Prime= $largest_prime\n"
Есть ли какая-то четкость блока без медлительности?
Обновление (04.01.2015, 10:40 EST)
Отличная обратная связь! Я сейчас использую следующее. Другие отзывы ?
largest_prime=1
separator=' '
for number_under_test in {1..100}; {
is_prime=true
factors=''
for ((divider = 2; divider < (number_under_test/2)+1; divider++)) {
remainder=$(($number_under_test % $divider))
if [ $remainder == 0 ]; then
is_prime=false
factors+=$divider' '
fi
}
if $is_prime; then
printf "\n${number_under_test} IS prime\n\n"
largest_prime=$number_under_test
else
printf "${number_under_test} is NOT prime, factors are: "
printf "$factors\n"
fi
}
printf "\nLargest Prime= $largest_prime\n"
number_under_test/2
а не до number_under_test-1
: ни один из коэффициентов числа n не больше n / 2, поэтому вы все равно найдете все факторы для не простых чисел, делая это. (Также, если вас интересует только проверка на простоту, было бы достаточно итерировать до sqrt (n), но Bash в любом случае не имеет встроенной функции для вычисления квадратных корней.)
(number_under_test/2)+1
чтобы учесть это
{}
не очень нужны после then
пункта , потому что then
уже служит в качестве группировки оператора (наряду с elif
, else
или fi
). На самом деле, в некоторых оболочках вы можете написать, например, for i in 1 2 3; { echo $i; }
без do
или done
.
Largest Prime= 100
на моем компьютере.