我正在编写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
}
答案 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。