使用BASH查找相邻的素数

时间:2015-11-19 11:28:37

标签: bash validation primes

我有一个非常艰苦的家庭作业(像我这样的初学者很难)。 我们必须找到给定数字的最近邻素数。 用户输入必须是两位数字,并且可以是素数。结果必须打印在屏幕上,由空格分隔。 对于输入验证:

while read -p "Give me a two-digit numer: " n && [[ -z $n ]] || [[ ! $n =~ ^[0-9]+$ ]] || [ $n -lt 10 ] || [ $n -gt 99 ]
do
    echo -e "\e[31mLet's try that again ...\e[0m"
done

我正在考虑使用已初始化的数组,其中包含从7到101的素数,并以某种方式将其与用户输入进行比较。

# Initialize an array with possible prime numbers
primes=(7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101)

# Create an inverted version of 'primes' array ... because of reasons ...
for (( i="${#primes[@]}-1" ; i>=0 ; i-- ));
do
    rprimes+="${primes[i]} "
done

还有谁喜欢' for'环

# To find the next prime number
i=0
for i in ${primes[@]}
do
    if [ $i -gt $n ]
    then
        gtn=$i
    break
    fi
done

# To find the previous prime number in the inverted 'rprimes' array
for i in ${rprimes[@]}
do
    if [ $i -lt $n ]
    then
        ltn=$i
    break
    fi
done

# Results:
echo "$ltn $n $gtn"

该剧本有效,但我真的很想知道,如果有办法找到以前的'值,无需创建倒置数组。

对不起,我是英文!

解决方案/编辑:

for (( i=0; for (( i=0; i<=${#primes[@]}; i++ ));
do
    if [ ${primes[i]} -lt $n ] && [ ${primes[i+1]} -ge $n ]
    then
        ltn=${primes[i]}
    break
    fi
done

2 个答案:

答案 0 :(得分:0)

您已经清楚地理解for循环,因为您使用一个来创建反向数组rprimes。只需在primes数组上运行前向for。不是ltn=${primes[i]}只是

的条件
[ ${primes[i]} -lt $n ] && [ ${primes[i+1]} -ge $n ]

gtn=${primes[i+1]}的条件同样

[ ${primes[i]} -le $n ] && [ ${primes[i+1]} -gt $n ]

答案 1 :(得分:0)

只要找到你感兴趣的素数指数,就可以很容易地看到±1:

for (( i=0; i<${#primes[@]}; i++ )) ; do
    if (( n <= primes[i] )) ; then
        p=$(( n == primes[i] ))
        echo ${primes[i-1]} $n ${primes[i+p]}
        break
    fi
done