Ho il seguente codice di lavoro:
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"
Questo codice viene eseguito rapidamente è 0,194 secondi. Tuttavia ho trovato && is_prime= false
un po 'difficile da leggere e potrebbe sembrare (all'occhio non allenato) come se fosse stato testato piuttosto che essere impostato, che è quello che fa. Quindi ho provato a cambiarlo &&
in an if...then
e questo funziona - ma è 75 volte più lento a 14,48 secondi. È più evidente sui numeri più alti.
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"
C'è qualcuno che doveva avere la chiarezza del blocco senza la lentezza?
Aggiornamento (1/4/2015 10:40 EST)
Ottimo riscontro! Ora sto usando il seguente. Qualche altro commento ?
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
invece di fino a number_under_test-1
: nessun fattore di un numero n è maggiore di n / 2, quindi troverai ancora tutto fattori per i numeri non primi facendo questo. (Anche se tu fossi interessato solo a testare il primeness, sarebbe sufficiente iterare fino a sqrt (n), ma Bash non ha comunque una funzione integrata per calcolare le radici quadrate.)
(number_under_test/2)+1
per consentirlo
{}
non sono realmente necessari dopo la then
clausola perché il then
serve già come operatore di raggruppamento (insieme a elif
, else
o fi
). In effetti, in alcune shell, è possibile scrivere, ad esempio, for i in 1 2 3; { echo $i; }
senza do
o done
.
Largest Prime= 100
sul mio computer.