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= falseein 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...thenund 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/2statt 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)+1zu ermöglichen
{}sind nicht wirklich nach der benötigten thenKlausel , da die thenbereits als Gruppierungs Operator dienen (zusammen mit elif, elseoder fi). Tatsächlich könnte man in einigen Muscheln beispielsweise for i in 1 2 3; { echo $i; }ohne dooder schreiben done.
Largest Prime= 100auf meinem Computer gedruckt .