筛选Eratosthenes UNIX脚本

时间:2013-02-18 00:40:53

标签: bash unix

我正在编写UNIX脚本以使用筛子生成素数。我在第19行继续得到一个坏的模数除法,我似乎无法弄明白为什么。

我尝试过各种不同的格式,不知道正确的方法是什么。

#!bin/bash
read -p "Upper limit? :" answer
theMultiple=2

#populate the array
for ((i=2;i<$answer;i++)); do
   sieveArray[$i]=$i
done
#Use Sieve
for ((i=0;i<=${#sieveArray[*]}; i++)); do
   if [ $[$(($[${sieveArray[$i]}] % $theMultiple))] -eq 0 ]; then
         theMultiple=${sieveArray[$i]}
         echo $theMultiple
         for ((j=$i;j<${#sieveArray[*]};j++)); do
            if [ $[$(($[${sieveArray[$j]}] % $theMultiple))] -eq 0 ]; then
               sieveArray[$j]=0
            fi
         done
   fi
done
}

2 个答案:

答案 0 :(得分:1)

你开始在索引2处填写你的sieveArray,但是在你的主循环中你开始在索引零处使用它。默认情况下,前两个元素可能设置为零,这会导致除以零。

答案 1 :(得分:0)

您可以使用较少的bash算法和更多命令来编写它:

#!/bin/bash
limit=$1
sieve="$(seq 2 $limit|sort)"

for n in 2 $(seq 3 2 $limit)
do
  sieve="$(comm -23 <(echo "$sieve") <(seq $(($n * $n)) $n $limit|sort))"
done

echo "$sieve"|sort -n

seq用于生成数字和倍数列表。 comm用于从sieve变量中删除倍数。由于comm期望数据按字母顺序排序(10在9之前),因此必须每次都对数字列表进行排序。

for循环略微优化,不包括偶数,但2。