Saya memiliki kode kerja berikut:
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"
Kode ini berjalan cepat adalah 0,194 detik. Namun saya menemukan && is_prime= false
sedikit sulit untuk dibaca dan itu bisa terlihat (dengan mata yang tidak terlatih) seolah-olah sedang diuji daripada ditetapkan yang memang demikian. Jadi saya mencoba mengubah &&
menjadi if...then
dan ini berhasil - tetapi 75 kali lebih lambat pada 14,48 detik. Ini paling terlihat pada angka yang lebih tinggi.
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"
Apakah ada kejelasan blok tanpa kelambatan?
Pembaruan (1/4/2015 10:40 pagi EST)
Umpan balik yang bagus! Saya sekarang menggunakan yang berikut ini. Ada tanggapan lain?
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
alih-alih hingga number_under_test-1
: Tidak ada faktor angka n lebih besar dari n / 2, sehingga Anda masih akan menemukan semua faktor untuk bilangan non-prima dengan melakukan ini. (Juga jika Anda hanya tertarik untuk menguji primeness, itu akan cukup untuk beralih ke sqrt (n), tetapi Bash tetap memiliki fungsi
(number_under_test/2)+1
untuk memungkinkan
{}
tidak benar-benar diperlukan setelah then
klausa karena then
sudah berfungsi sebagai operator pengelompokan (bersama dengan elif
, else
atau fi
). Bahkan, dalam beberapa shell, Anda dapat menulis, misalnya, for i in 1 2 3; { echo $i; }
tanpa do
atau done
.
Largest Prime= 100
di komputer saya.