ฉันมีรหัสการทำงานต่อไปนี้:
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"
รหัสนี้ทำงานอย่างรวดเร็วคือ 0.194 วินาที อย่างไรก็ตามฉันพบว่า&& is_prime= false
อ่านยากนิดหน่อยและมันอาจดู (กับตาที่ไม่ได้รับการฝึกฝน) ราวกับว่ามันถูกทดสอบมากกว่าที่จะถูกตั้งค่าซึ่งเป็นสิ่งที่มันทำ ดังนั้นฉันจึงลองเปลี่ยนค่า&&
เป็น a if...then
และทำงานได้ - แต่ช้าลง 75 เท่าเวลา 14.48 วินาที มันเห็นได้ชัดเจนที่สุดในจำนวนที่สูงขึ้น
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"
มีใครบ้างที่จะต้องมีความชัดเจนของบล็อกโดยไม่มีความช้า?
อัปเดต (1/4/2015 10:40 น. EST)
ข้อเสนอแนะที่ยอดเยี่ยม! ตอนนี้ฉันใช้สิ่งต่อไปนี้ ข้อเสนอแนะอื่น ๆ ?
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
แทนที่จะเป็นnumber_under_test-1
: ไม่มีตัวประกอบของตัวเลข n มากกว่า n / 2 ดังนั้นคุณจะยังคงพบทั้งหมด ปัจจัยสำหรับตัวเลขที่ไม่สำคัญโดยการทำเช่นนี้ (และถ้าคุณสนใจที่จะทดสอบความเป็นเอกสิทธิ์เท่านั้นก็เพียงพอที่จะทำซ้ำได้ถึง sqrt (n) แต่ Bash ไม่มีฟังก์ชันในตัวเพื่อคำนวณรากที่สองต่อไป)
(number_under_test/2)+1
อนุญาตให้ทำเช่นนั้น
{}
ไม่จำเป็นจริงๆหลังจากที่then
ข้อเพราะthen
ทำหน้าที่อยู่แล้วเป็นผู้ประกอบการจัดกลุ่ม (พร้อมด้วยelif
, else
หรือfi
) ในความเป็นจริงในเปลือกหอยบางอย่างที่คุณสามารถเขียนยกตัวอย่างเช่นfor i in 1 2 3; { echo $i; }
ไม่มีหรือdo
done
Largest Prime= 100
ลงบนคอมพิวเตอร์ของฉัน