Go Leetcode系列 计数质数

计数质数

统计所有小于非负整数 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

猜你喜欢

转载自blog.csdn.net/qq_29175897/article/details/106861989