1.方法1(除了1和它本身外,不能被其他自然数整除)
fun getPrimeNumber1(start: Int, end: Int): ArrayList<String> {
val res: ArrayList<String> = ArrayList();
var isParams: Boolean;
for (i in start..end) {
isParams = true;
for (a in 2 until i) {
if (i % a == 0) {
isParams = false
break
}
}
if (isParams) {
res.add("$i")
}
}
return res
}
2.方法2(6n±1)
fun getPrimeNumber2(start: Int, end: Int): ArrayList<String> {
val res: ArrayList<String> = ArrayList();
if (start <= 3) {
res.add("2")
res.add("3")
}
loop@ for (num in start..end) {
// 不在6的倍数两侧的一定不是质数
if (num % 6 != 1 && num % 6 != 5) {
continue
}
//这里是通过Math类返回数字x的平方根
val sqrt = sqrt(num.toDouble()).toInt()
var i = 5
while (i <= sqrt) {
if (num % i == 0 || num % (i + 2) == 0) {
continue@loop
}
i += 6
}
res.add("$num")
}
return res
}
3.方法3(埃式筛法(埃拉托斯特尼算法))
fun getPrimeNumber3(start: Int, end: Int): ArrayList<String> {
val booleanRes = BooleanArray(end, init = { false })
for (i in 2 until end) {
if (!booleanRes[i]) {
var a = 2 * i
while (a < end) {
booleanRes[a] = true
a += i
}
}
}
val res: ArrayList<String> = ArrayList();
for (i in start until end) {
if (!booleanRes[i]) {
res.add("$i")
}
}
return res
}
4.还有一个欧拉算法,下次想起来再说。
按照时间来算的话,2000000以内,1>2>3。
|