Tengo el siguiente código de trabajo:
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"
Este código se ejecuta rápidamente es 0.194 segundos. Sin embargo, me pareció && is_prime= false
un poco difícil de leer y podría parecer (a simple vista) como si estuviera siendo probado en lugar de estar configurado, que es lo que hace. Así que intenté cambiar el &&
a an if...then
y esto funciona, pero es 75 veces más lento a los 14.48 segundos. Es más notable en los números más altos.
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"
¿Hay alguna para tener la claridad del bloque sin la lentitud?
Actualización (1/4/2015 10:40 am EST)
Gran respuesta! Ahora estoy usando lo siguiente. Algún otro comentario ?
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
lugar de hasta number_under_test-1
: Ningún factor de un número n es mayor que n / 2, por lo que aún encontrará todos factores para números no primos al hacer esto. (Además, si solo estuvieras interesado en probar la primacía, sería suficiente iterar hasta sqrt (n), pero Bash no tiene una función incorporada para calcular raíces cuadradas de todos modos).
(number_under_test/2)+1
para permitirlo
{}
no son realmente necesarios después de la then
cláusula porque el then
ya sirve como operador de agrupación (junto con elif
, else
o fi
). De hecho, en algunos shells, podría escribir, por ejemplo, for i in 1 2 3; { echo $i; }
con do
o sin done
.
Largest Prime= 100
en mi computadora.