次の作業コードがあります。
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
読書が少し難しく、(訓練されていない目には)設定されているのではなく、テストされているようです。それで&&
an に変更してみたところ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分ET)
良いフィードバック!現在、以下を使用しています。他の提案はありませんか?
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"
ベストアンサー1
その理由は、毎回サブシェルを生成するからです。
if ([ $remainder == 0 ] && [ $is_prime == true ]); then
かっこを削除するだけです
if [ $remainder == 0 ] && [ $is_prime == true ]; then
コマンドをグループ化するには、次の構文を使用します。現在のシェル:
if { [ $remainder == 0 ] && [ $is_prime == true ]; }; then
(末尾のセミコロンが必要です。手動)
これは[ is_prime ]
以下とは異なります。角かっこなしで[ $is_prime == true ]
簡単に書くと、bash組み込みまたはコマンドが呼び出されます。 1つの引数、文字列 "is_prime"を取るテストです。引数が与えられたときに引数が空でない場合、結果は成功し、リテラル文字列は常に空ではないため、常に「true」です。$is_prime
true
false
[ is_prime ]
[
読みやすくするために非常に長い行を変更します。
[ $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
到着
if [ $is_prime == true ]; then
echo "${number_under_test} is prime!"
else
echo "${number_under_test} is NOT prime (factors= $factors)"
# removed extraneous [ $is_prime == true ] test that you probably
# didn't notice off the edge of the screen
largest_prime=$number_under_test
fi
明確さを高めるためにスペースを過小評価しないでください。