다음 작업 코드가 있습니다.
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
조금 읽기가 어렵다는 것을 알았고 그것이 설정되어있는 것이 아니라 테스트되고있는 것처럼 (훈련되지 않은 눈으로) 보일 수 있습니다. 나는 변경 시도 그래서 &&
에 if...then
14.48 초에 75 번 느리지 만 - 그리고이 작품. 숫자가 높을수록 가장 두드러집니다.
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"
속도가 느려지지 않고 블록의 선명도가 있어야합니까?
업데이트 (2015 년 1 월 4 일 오전 10시 40 분)
좋은 피드백! 나는 지금 다음을 사용하고 있습니다. 또 다른 제안 있나요 ?
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; }
no do
또는로 쓸 수 done
있습니다.
Largest Prime= 100
하면 내 컴퓨터에 스크립트가 인쇄 됩니다.