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= falsebiraz 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...then14.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/2yerine yukarı kadar olan number_under_test-1bir 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)+1izin vermem gerekiyordu
{}gerçekten sonra gerekli değildir thençünkü maddesi thenzaten (birlikte bir gruplandırma operatörü olarak hizmet veren elif, elseya da fi). Aslında, bazı kabuklarda, sen, örneğin, yazabiliriz for i in 1 2 3; { echo $i; }hiçbir ile doveya done.
Largest Prime= 100bilgisayarıma yazdırır .