📅  最后修改于: 2023-12-03 15:38:26.604000             🧑  作者: Mango
在 Shell 脚本中,检查一个数是否为素数是一个经典问题。本文将介绍两种方法:暴力枚举和埃氏筛法。
暴力枚举法的思路很简单:对于给定的正整数 $n$,从 $2$ 到 $n-1$,逐个判断是否能够整除该数。如果能够整除,则说明该数不是素数;否则就是素数。
具体实现如下:
#!/bin/bash
read -p "请输入一个正整数: " n
if [ $n -le 1 ]; then
echo "不是素数!"
exit -1
fi
is_prime=true
for((i=2;i<$n;i++))
do
if [ $(($n%$i)) -eq 0 ]; then
is_prime=false
break
fi
done
if [ $is_prime = true ]; then
echo "$n 是素数!"
else
echo "$n 不是素数!"
fi
具体解释:
暴力枚举方法的时间复杂度为 $O(n)$,会随着 $n$ 增大而增加。为了更高效地检查素数,我们可以使用埃氏筛法。
埃氏筛法的思路:我们将从 $2$ 开始,将每个素数的倍数都标记成合数,然后在下一个未被标记的数开始,继续进行上述操作。直到筛完所有小于等于 $n$ 的数,剩下的未被标记的数即为素数。
具体实现如下:
#!/bin/bash
read -p "请输入一个正整数: " n
if [ $n -le 1 ]; then
echo "不是素数!"
exit -1
fi
# 将数组全部标记为素数
for((i=2;i<=$n;i++))
do
is_prime[i]=true
done
# 埃氏筛法
for((i=2;i*i<=$n;i++))
do
if [ ${is_prime[i]} = true ]; then
for((j=i*i;j<=$n;j+=i))
do
is_prime[j]=false
done
fi
done
if [ ${is_prime[n]} = true ]; then
echo "$n 是素数!"
else
echo "$n 不是素数!"
fi
具体解释:
is_prime
,将数组全部标记为素数;本文介绍了两种在 Shell 脚本中检查素数的方法:暴力枚举法和埃氏筛法。其中,暴力枚举法的时间复杂度为 $O(n)$,埃氏筛法的时间复杂度为 $O(\sqrt{n})$,后者效率更高。希望本文对大家有所帮助!