找出int32正整数范围内所有的质数并输出最大质数与质数数量-Go语言
int32正整数范围内最大质数为2147483647,质数数量为105097565
代码实现
package main
import (
"fmt"
"math"
)
func main() {
const MX = math.MaxInt32 + 1
cnt := 0
isPrime := make([]bool, MX)
for i := 0; i < MX; i++ {
isPrime[i] = true
}
for i := 2; i*i < MX; i++ {
if isPrime[i] {
for j := i * i; j < MX; j += i {
isPrime[j] = false
}
}
}
for i := MX - 1; i >= 0; i-- {
if isPrime[i] {
fmt.Println(i)
break
}
}
for i := 2; i < MX; i++ {
if isPrime[i] {
cnt++
}
}
fmt.Println(cnt)
}
此算法搜索质数部分的时间复杂度计算比较困难,结果是
O
(
N
log
log
N
)
O(N \log \log N)
O(NloglogN) 。
n
/
2
+
n
/
3
+
n
/
5
+
n
/
7
+
⋯
=
n
×
(
1
/
2
+
1
/
3
+
1
/
5
+
1
/
7
+
…
)
n/2 + n/3 + n/5 + n/7 + \dots = n \times (1/2 + 1/3 + 1/5 + 1/7 + \dots)
n/2+n/3+n/5+n/7+⋯=n×(1/2+1/3+1/5+1/7+…)
相关习题
P5736 【深基7.例2】质数筛
AC代码
package main
import "fmt"
func main() {
const MAXNUM = 100001
var n int
isPrime := [MAXNUM]bool{}
for i := 2; i < MAXNUM; i++ {
isPrime[i] = true
}
for i := 2; i*i <= MAXNUM; i++ {
if isPrime[i] {
for j := i * i; j < MAXNUM; j += i {
isPrime[j] = false
}
}
}
fmt.Scan(&n)
nums := make([]int, n)
for i := 0; i < n; i++ {
fmt.Scan(&nums[i])
}
flag := false
for i := 0; i < n; i++ {
if isPrime[nums[i]] {
if flag {
fmt.Print(" ")
}
fmt.Print(nums[i])
flag = true
}
}
}