मेरे पास निम्नलिखित कार्य कोड है:
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मेरे कंप्यूटर पर प्रिंट होती है ।