Tôi có mã làm việc sau đây:
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"
Mã này chạy nhanh là 0,194 giây. Tuy nhiên tôi thấy && is_prime= false
hơi khó đọc và nó có thể nhìn (đến mắt chưa được huấn luyện) như thể nó đang được thử nghiệm chứ không phải là thiết lập như những gì nó làm. Vì vậy, tôi đã thử thay đổi &&
thành một if...then
và điều này hoạt động - nhưng chậm hơn 75 lần ở 14,48 giây. Đó là đáng chú ý nhất trên những con số cao hơn.
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"
Có ai có được sự rõ ràng của khối mà không có sự chậm chạp?
Cập nhật (1/4/2015 10:40 sáng EST)
Phản hồi tuyệt vời! Bây giờ tôi đang sử dụng như sau. Có phản hồi nào khác không ?
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
thay vì tối đa number_under_test-1
: Không có yếu tố nào của số n lớn hơn n / 2, vì vậy bạn vẫn sẽ tìm thấy tất cả các yếu tố cho số không nguyên tố bằng cách làm điều này. (Ngoài ra nếu bạn chỉ quan tâm đến việc kiểm tra tính nguyên thủy, thì việc lặp lại lên sqrt (n) là đủ, nhưng Bash không có chức năng tích hợp sẵn để tính căn bậc hai.)
(number_under_test/2)+1
để cho phép điều đó
{}
không thực sự cần thiết sau khi các then
khoản vì then
đã phục vụ như là một nhà điều hành nhóm (cùng với elif
, else
hoặc fi
). Trong thực tế, trong một số shell, bạn có thể viết, ví dụ, for i in 1 2 3; { echo $i; }
không có do
hoặc done
.
Largest Prime= 100
trên máy tính của tôi.