मेरे पास निम्नलिखित कार्य कोड है:
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"
क्या बिना सुस्ती के ब्लॉक की स्पष्टता होनी चाहिए थी?
अपडेट (1/4/2015 10:40 am 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) तक पुनरावृत्त करने के लिए पर्याप्त होगा, लेकिन बैश में वैसे भी वर्गमूल की गणना करने के लिए एक अंतर्निहित फ़ंक्शन नहीं है।)
(number_under_test/2)+1
लिए अनुमति देने के लिए बनाना पड़ा
{}
वास्तव में के बाद आवश्यक नहीं हैं then
खंड क्योंकि then
पहले से ही (के साथ एक समूहीकरण ऑपरेटर के रूप में कार्य करता है elif
, else
या fi
)। वास्तव में, कुछ गोले में, आप लिख सकते हैं, उदाहरण के लिए, for i in 1 2 3; { echo $i; }
नहीं के साथ do
या done
।
Largest Prime= 100
मेरे कंप्यूटर पर प्रिंट होती है ।