Mam następujący działający kod:
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"
Ten kod działa szybko i wynosi 0,194 sekundy. Jednak uważam, że && is_prime= false
jest trochę trudny do odczytania i może wyglądać (dla niewprawnego oka), jakby był testowany, a nie ustawiony, co robi. Próbowałem więc zmienić &&
na if...then
i to działa - ale jest 75 razy wolniejsze przy 14,48 sekundy. Jest to najbardziej zauważalne przy wyższych liczbach.
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"
Czy jest jakaś klarowność bloku bez powolności?
Aktualizacja (1/4/2015 10:40 EST)
Świetna opinia! Teraz używam następujących. Jakaś inna opinia ?
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
zamiast zamiast do number_under_test-1
: Żaden czynnik liczby n nie jest większy niż n / 2, więc nadal znajdziesz wszystko Czynniki dla liczb niepierwszych wykonując to. (Również jeśli chciałbyś tylko przetestować prymityw, wystarczy iterować do sqrt (n), ale Bash nie ma wbudowanej funkcji do obliczania pierwiastków kwadratowych.)
(number_under_test/2)+1
pozwolić
{}
nie są naprawdę potrzebne po then
klauzuli, ponieważ then
już służy jako operator grupującego (wraz z elif
, else
lub fi
). W rzeczywistości w niektórych powłokach można pisać na przykład for i in 1 2 3; { echo $i; }
bez do
lub done
.
Largest Prime= 100
na moim komputerze.