使用 BASH 查找相邻素数

Find neighbouring prime numbers using BASH

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

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"

脚本有效,但我真的很想知道,是否有一种方法可以找到 'previous' 值而不需要创建倒排数组。

对不起我的英语!

Solution/Edit:

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

您已经清楚地理解了 for 循环,因为您使用一个来创建反向数组 rprimes。只是 运行 一个前向 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即可轻松查看:

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