Eu tenho o seguinte código de trabalho:
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"
Esse código é executado rapidamente é de 0,194 segundos. No entanto, achei && is_prime= false
um pouco difícil de ler e poderia parecer (para um olho destreinado) como se estivesse sendo testado, em vez de definido como é o que faz. Então, eu tentei mudar o &&
para um if...then
e isso funciona - mas é 75 vezes mais lento em 14,48 segundos. É mais perceptível nos números mais 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"
Existe algum para ter a clareza do bloco sem a lentidão?
Atualização (1/4/2015 10:40 EST)
Ótimo feedback! Agora estou usando o seguinte. Alguma outra resposta ?
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
vez de até number_under_test-1
: Nenhum fator de um número n é maior que n / 2; portanto, você ainda encontrará tudo fatores para números não primos, fazendo isso. (Além disso, se você estivesse interessado apenas em testar a primidez, seria suficiente iterar até o sqrt (n), mas o Bash não tem uma função
(number_under_test/2)+1
para permitir isso
{}
não são realmente necessários após a then
cláusula porque o then
já serve como um operador de agrupamento (junto com elif
, else
ou fi
). De fato, em algumas conchas, você pode escrever, por exemplo, for i in 1 2 3; { echo $i; }
sem do
ou done
.
Largest Prime= 100
no meu computador.