?? ex68.sh
字號:
#!/bin/bash# sieve.sh (ex68.sh)# 埃拉托色尼素數篩子# 找素數的經典算法. # 在同等數值的范圍內, #+ 這個腳本運行的速度比C版本慢的多. LOWER_LIMIT=1 # 從1開始. UPPER_LIMIT=1000 # 到1000. # (如果你時間很多的話 . . . 你可以將這個數值調的很高.)PRIME=1NON_PRIME=0let SPLIT=UPPER_LIMIT/2# 優化: # 只需要測試中間到最大的值(為什么?). # (譯者注: 這個變量在腳本正文并沒有被使用, 僅僅在107行之后的優化部分才使用.)declare -a Primes# Primes[]是個數組. initialize (){# 初始化數組. i=$LOWER_LIMITuntil [ "$i" -gt "$UPPER_LIMIT" ]do Primes[i]=$PRIME let "i += 1"done# 假定所有數組成員都是需要檢查的(素數)#+ 直到檢查完成. }print_primes (){# 打印出所有數組Primes[]中被標記為素數的元素. i=$LOWER_LIMITuntil [ "$i" -gt "$UPPER_LIMIT" ]do if [ "${Primes[i]}" -eq "$PRIME" ] then printf "%8d" $i # 每個數字打印前先打印8個空格, 在偶數列才打印. fi let "i += 1" done}sift () # 查出非素數. {let i=$LOWER_LIMIT+1# 我們都知道1是素數, 所以我們從2開始. # (譯者注: 從2開始并不是由于1是素數, 而是因為要去掉以后每個數的倍數, 感謝網友KevinChen.)until [ "$i" -gt "$UPPER_LIMIT" ]doif [ "${Primes[i]}" -eq "$PRIME" ]# 不要處理已經過濾過的數字(被標識為非素數).then t=$i while [ "$t" -le "$UPPER_LIMIT" ] do let "t += $i " Primes[t]=$NON_PRIME # 標識為非素數. donefi let "i += 1"done }# ==============================================# main ()# 繼續調用函數. initializesiftprint_primes# 這里就是被稱為結構化編程的東西. # ==============================================echoexit 0# -------------------------------------------------------- ## 因為前面的'exit'語句, 所以后邊的代碼不會運行. # 下邊的代碼, 是由Stephane Chazelas所編寫的埃拉托色尼素數篩子的改進版本, #+ 這個版本可以運行的快一些. # 必須在命令行上指定參數(這個參數就是: 尋找素數的限制范圍). UPPER_LIMIT=$1 # 來自于命令行. let SPLIT=UPPER_LIMIT/2 # 從中間值到最大值. Primes=( '' $(seq $UPPER_LIMIT) )i=1until (( ( i += 1 ) > SPLIT )) # 僅需要從中間值檢查. do if [[ -n $Primes[i] ]] then t=$i until (( ( t += i ) > UPPER_LIMIT )) do Primes[t]= done fi done echo ${Primes[*]}exit 0
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -