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