Aşağıdaki çalışma koduna sahibim:
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"
Bu kod hızlı bir şekilde çalışıyorsa 0.194 saniyedir. Ancak && is_prime= false
biraz okumayı zor buldum ve ne yaptığını ayarlamak yerine test ediliyormuş gibi (eğitimsiz göze) bakabiliyordu. Değiştim çalıştı Yani &&
bir içine if...then
14.48 saniyede 75 kat daha yavaş ama - ve bu eserlerin. En yüksek rakamlarda en belirgindir.
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"
Herhangi bir yavaşlık olmadan bloğun netliğini sağlamak oldu mu?
Güncelleme (1/4/2015 10:40 EST)
Harika geri bildirim! Şimdi aşağıdakileri kullanıyorum. Başka geribildirim var mı?
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
yerine yukarı kadar olan number_under_test-1
bir dizi yok faktörünü n hala tüm bulacaksınız bu yüzden, n / 2'den büyük: asal olmayan sayılar için faktörleri bunu yaparak (Ayrıca, yalnızca asallık için test yapmakla ilgileniyorsanız, sqrt (n) 'e kadar yinelemek yeterli olacaktır, ancak Bash'in yine de kare kökleri hesaplamak için yerleşik bir işlevi yoktur.)
(number_under_test/2)+1
izin vermem gerekiyordu
{}
gerçekten sonra gerekli değildir then
çünkü maddesi then
zaten (birlikte bir gruplandırma operatörü olarak hizmet veren elif
, else
ya da fi
). Aslında, bazı kabuklarda, sen, örneğin, yazabiliriz for i in 1 2 3; { echo $i; }
hiçbir ile do
veya done
.
Largest Prime= 100
bilgisayarıma yazdırır .