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