Ich habe den folgenden Arbeitscode:
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"
Dieser Code läuft schnell ist 0,194 Sekunden. Ich fand das jedoch && is_prime= false
ein bisschen schwer zu lesen und es könnte (für das ungeübte Auge) so aussehen, als würde es getestet, anstatt gesetzt zu werden, was es tut. Also habe ich versucht das &&
in ein zu ändern if...then
und das funktioniert - ist aber 75 mal langsamer bei 14,48 Sekunden. Am deutlichsten macht sich dies bei den höheren Zahlen bemerkbar.
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"
Gibt es eine, die die Klarheit des Blocks ohne Langsamkeit haben sollte?
Aktualisierung (04.01.2015, 10:40 Uhr EST)
Tolles Feedback! Ich benutze jetzt die folgenden. Irgendwelche anderen Rückmeldungen ?
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
statt bis zu iterieren number_under_test-1
: Kein Faktor einer Zahl n ist größer als n / 2, sodass Sie immer noch alle finden Faktoren für Nicht-Primzahlen auf diese Weise. (Auch wenn Sie nur auf Primheit testen möchten, ist es ausreichend, bis zu sqrt (n) zu iterieren, aber Bash verfügt ohnehin nicht über eine integrierte Funktion zum Berechnen von Quadratwurzeln.)
(number_under_test/2)+1
zu ermöglichen
{}
sind nicht wirklich nach der benötigten then
Klausel , da die then
bereits als Gruppierungs Operator dienen (zusammen mit elif
, else
oder fi
). Tatsächlich könnte man in einigen Muscheln beispielsweise for i in 1 2 3; { echo $i; }
ohne do
oder schreiben done
.
Largest Prime= 100
auf meinem Computer gedruckt .