shell脚本实现查找素数-简单暴力求解、素数筛、线性筛

素数简单暴力求解

素数:只能被1和其本身整除的整数

素数总是一个比较常涉及到的内容,掌握求素数的方法是一项基本功。而暴力求解,是每一个接触过编程求素数问题的人都必然学习过的一种算法,它从素数的定义出发(在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数),直观好理解:

完整代码:
#!/bin/bash

#如果参数的个数不等于2,直接退出, $#获取参数的个数
if [[ $# -ne 2 ]];then
    echo "Usage: $0 start_num end_num"
    exit
fi

START=$1
END=$2

function isPrime() {
    num=$1
    local i
    for (( i=2; i<${num}; i++ ));do
        if [[ $[ ${num} % $i ] -eq 0 ]];then
            return 1
        fi  
    done
    return 0
}

for (( i=${START}; i<=${END}; i++ ));do
    isPrime $i
    if [[ $? -eq 0 ]];then
        echo "$i"
    fi  
done

素数筛

素数筛法原理:2是素数,那么2的所有倍数都是合数,把2所有倍数都标记出来,以此类推,3也是素数,我们也可以把3的所有倍数都标记起来,最后我们可以把所有合数标记起来,素数没有被标记。素数筛的时间复杂度O(nloglogn)比暴力枚举更加有效率,但我们可以看出6这个数字被标记了两次(被2标记了一次又被3标记了一次)所以这种算法还是有缺陷的。

完整代码:
#!/bin/bash

#如果参数的个数不等于2,直接退出, $#获取参数的个数
if [[ $# -ne 2 ]];then
    echo "Usage: $0 start_num end_num"
    exit
fi

START=$1
END=$2
#定义数组,也可不定义
declare -a prime

function initPrime() {
    num=$1
    local i
    prime[1]=1
    #素数筛实现
    for (( i=2; i<=${num}; i++ ));do
        for (( j=$[ ${i} * ${i} ]; j<=${num}; j+=${i} ));do
            prime[$j]=1
        done
    done
}

initPrime ${END}

for (( i=${START}; i<=${END}; i++ ));do
    if [[ ${prime[$i]}x == x ]];then
        echo "$i"
    fi  
done

线性筛

求一定范围内的素数和。

采用线性筛实现

1、传入两个参数

1) 第一个为起始数字start_num(包含该数字)

2) 第二个为终止数字end_num(包含该数字)

2、输出该范围内的所有素数的和

3、使用方式`bash Prime.sh 1 100

完整代码:
#!/bin/bash

#如果参数的个数不等于2,直接退出, $#获取参数的个数
if [[ $# -ne 2 ]];then
    echo "Usage: $0 start_number end_number"
    exit
fi

START=$1
END=$2
#定义数组,也可不定义
declare -a prime

function initPrime() {
    num=$1
    local i
    #线性筛的实现
    for (( i=2; i<=${num}; i++ ));do
        if [[ ${prime[$i]}x == x ]];then
            prime[0]=$[${prime[0]} + 1]
            prime[${prime[0]}]=$i
        fi  
        for (( j=1; j<=${prime[0]}; j++ ));do
            if [[ $[$i * ${prime[$j]}] -gt ${num} ]];then
                break
            fi  
            prime[$[$i * ${prime[$j]}]]=1
            if [[ $[$i % ${prime[$j]} ] -eq 0 ]];then
                break
            fi  
        done
    done
}

initPrime ${END}

for (( i=1; i<=${prime[0]}; i++ ));do
    echo "${prime[$i]}"
	if [[ ${Prime[$i]}x == x ]];then
        sum=$[ ${sum} + ${i} ]
    fi
done
echo ${sum}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值