У мене є такий робочий код:
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"
Чи має бути якась чіткість блоку без повільності?
Оновлення (01.04.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на моєму комп'ютері.