0

ふるいを使用して素数を生成する 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
}
4

2 に答える 2

1

インデックス 2 で sieveArray の入力を開始しますが、メイン ループではインデックス 0 で使用を開始します。最初の 2 つの要素はおそらくデフォルトでゼロに設定されているため、ゼロによる除算が行われます。

于 2013-02-18T00:55:02.587 に答える
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データがアルファベット順 (10 は 9 より前) でソートされるとcomm予想されるため、数値のリストは毎回ソートする必要があります。

ループは、for2 以外の偶数を含まないようにわずかに最適化されています。

于 2013-02-19T14:05:46.227 に答える