我有以下工作代码:
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
)。实际上,在某些shell中,您可以编写例如for i in 1 2 3; { echo $i; }
no do
或done
。
Largest Prime= 100
在我的计算机上。