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= falsehơ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...thenvà đ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/2thay 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 thenkhoản vì thenđã phục vụ như là một nhà điều hành nhóm (cùng với elif, elsehoặ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ó dohoặc done.
Largest Prime= 100trên máy tính của tôi.