素数简单暴力求解
素数:只能被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}