私は次の作業コードを持っています:
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分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; }
no do
またはで書くことができますdone
。
Largest Prime= 100
と、それがコンピューターに印刷されます。