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= falseun 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...theny 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/2lugar 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)+1para permitirlo
{}no son realmente necesarios después de la thencláusula porque el thenya sirve como operador de agrupación (junto con elif, elseo fi). De hecho, en algunos shells, podría escribir, por ejemplo, for i in 1 2 3; { echo $i; }con doo sin done.
Largest Prime= 100en mi computadora.