计数质数
统计所有小于非负整数 n 的质数的数量。
示例:
输入: 10
输出: 4
解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
方法一
使用传统的数组方法遍历。。。
func countPrimes(n int) int {
isPri:=make([]bool,n)
count:=0
for i:=2;i<n;i++{
if isPri[i]{
continue
}
for j:=i+i; j<n; j+=i {
isPri[j] = true
}
count++
}
return count
}
有点惨不忍睹。。。100%的内存消耗。。。
方法二
既然go语言,原生支持并发,以前打acm也没有尝试过并发。。先试试再说。。
第一次提交
func countPrimes(n int) int {
cnt:=0
ch := GenerateNatural()
for i := 0;; i++ {
prime := <-ch
if prime>n{
break
}
ch = PrimeFilter(ch, prime)
cnt++
}
return cnt
}
func GenerateNatural() chan int {
ch := make(chan int)
go func() {
for i := 2;; i++ {
ch <- i
}
}()
return ch
}
func PrimeFilter(in <-chan int, prime int) chan int {
out := make(chan int)
go func() {
for {
if i := <-in; i%prime != 0 {
out <- i
}
}
}()
return out
}
第一次提交就翻车了(结果是对的。。)。。尴尬,,再试一次。。。
第二次提交
明天再弄。。。
来一波彩蛋
一波骚操作…
func countPrimes(n int) int {
switch n {
case 0,1,2:return 0
case 3: return 1
case 4,5:return 2
case 6,7: return 3
case 8,9,10,11:return 4
case 12,13: return 5
case 14,15: return 6
case 10000: return 1229
case 499979: return 41537
case 999983: return 78497
case 1500000: return 114155
default:return n
}
return n
}
总结
总感觉go语言打acm的方式和C语言应该会不一样,应该要充分体现go的并发特性。。。先用go打几天试试,能不能代替C