📌  相关文章
📜  如何在 shell 脚本中检查素数 - Shell-Bash (1)

📅  最后修改于: 2023-12-03 15:38:26.604000             🧑  作者: Mango

如何在 shell 脚本中检查素数 - Shell-Bash

在 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

具体解释:

  • 首先从用户输入读取一个正整数 $n$;
  • 如果 $n$ 不大于 $1$,那么直接判断出它不是素数;
  • 从 $2$ 到 $n-1$ 遍历每个数,判断是否能够整除 $n$;
  • 如果存在一个数能够整除 $n$,那么就判断出 $n$ 不是素数,跳出循环;
  • 如果循环结束后,$n$ 依然没有被判定为非素数,那么就判断 $n$ 是素数。
埃氏筛法

暴力枚举方法的时间复杂度为 $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

具体解释:

  • 和暴力枚举法相同,首先从用户输入读取一个正整数 $n$;
  • 如果 $n$ 不大于 $1$,那么直接判断出它不是素数;
  • 初始化一个长度为 $n+1$ 的布尔型数组 is_prime,将数组全部标记为素数;
  • 从 $2$ 到 $\sqrt{n}$ 遍历每个数 $i$,如果 $i$ 是素数,则将 $i$ 的倍数全部标记为非素数;
  • 遍历的复杂度为 $O(\sqrt{n})$,标记每个数的复杂度也为 $O(\sqrt{n})$;
  • 最后只需判断 $n$ 是否是素数即可。
总结

本文介绍了两种在 Shell 脚本中检查素数的方法:暴力枚举法和埃氏筛法。其中,暴力枚举法的时间复杂度为 $O(n)$,埃氏筛法的时间复杂度为 $O(\sqrt{n})$,后者效率更高。希望本文对大家有所帮助!