J'ai le code de travail suivant:
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"
Ce code court vite est de 0.194 secondes. Cependant, j’ai trouvé le && is_prime= false
lecteur un peu difficile à lire et il pourrait sembler (à l’œil non averti) qu’il était en train d’être testé, plutôt que réglé, ce qui est le cas. Alors j'ai essayé de changer le &&
en un if...then
et cela fonctionne - mais est 75 fois plus lent à 14,48 secondes. C'est surtout visible sur les nombres les plus élevés.
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"
Y at-il était d'avoir la clarté du bloc sans la lenteur?
Mise à jour (1/4/2015 10:40 am EST)
Excellent retour J'utilise maintenant ce qui suit. Pas d'autres commentaires ?
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
lieu de number_under_test-1
: Le facteur n n'est pas supérieur à n / 2, vous pourrez donc toujours trouver tous facteurs pour les nombres non premiers en faisant cela. (De plus, si vous n'étiez intéressé que par le test de primauté, il suffirait d'effectuer une itération jusqu'à sqrt (n), mais Bash n'a de toute façon pas de fonction intégrée permettant de calculer les racines carrées.)
(number_under_test/2)+1
pour permettre cela
{}
ne sont pas vraiment nécessaires après l' then
article , car le then
sert déjà comme un opérateur de regroupement (avec elif
, else
ou fi
). En fait, dans certains coquillages, vous pourriez écrire, par exemple, for i in 1 2 3; { echo $i; }
sans do
ou done
.
Largest Prime= 100
sur mon ordinateur.