简介

什么是素数?
   素数也叫质数,是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。

判断素数的方法:
   思路一:判断一个数是否素数,只需要把m 被 2~m-1之间的每一个整数去除,如果都不能被整除,那么m就是一个素数。
   思路二:用n分别去除2到sqrt(n)-1,如果能被整除,则表明此数不是素数,反之是素数。

解法

暴力方式

通过双层循环判断查找、时间复杂度 O(n^2)


//暴力判断 时间复杂度O(n^2)
func TestIsPrime(t *testing.T) {count:=0for i:=2; i< num ;i++  {if is_prime(i){count++}}fmt.Printf("Prim_Count: %v ; prime: %v; \n",count,num)
}
//暴力判断
func is_prime(num int) bool {//从2遍历到n-1,看看是否有因子for i := 2; i < num; i++ {if num %i == 0 {//发现一个因子被整除return false}}return true
}

利用sqrt平方根方法求素数的个数

利用sqrt平方根方法求素数的个数,函数的时间复杂度降为 O(sqrt(N))

利用sqrt平方根方法求素数的个数,例如 num =12 能够发现
12 = 2 × 6
12 = 3 × 4
12 = sqrt(12) × sqrt(12)
12 = 4 × 3
12 = 6 × 2
可以看到,后两个乘积就是前面两个反过来,反转临界点就在 sqrt(n)。
也就是说,如果在 [2,sqrt(n)] 这个区间之内没有发现可整除因子,就可以直接断定 n 是素数了,因为在区间 [sqrt(n),n] 也一定不会发现可整除因子。函数的时间复杂度降为 O(sqrt(N))

/*利用sqrt平方根方法求素数的个数,例如 num =12 能够发现12 = 2 × 612 = 3 × 412 = sqrt(12) × sqrt(12)12 = 4 × 312 = 6 × 2可以看到,后两个乘积就是前面两个反过来,反转临界点就在 sqrt(n)。也就是说,如果在 [2,sqrt(n)] 这个区间之内没有发现可整除因子,就可以直接断定 n 是素数了,因为在区间 [sqrt(n),n] 也一定不会发现可整除因子。函数的时间复杂度降为 O(sqrt(N))*/
func TestIsPrimeV2(t *testing.T) {fmt.Printf("nSqrt:%v \n",math.Sqrt(float64(num)))count:=0for i:=2; i< num; i++  {if is_prime_v2(i){//fmt.Printf("prime : %v \n",i)count++}}fmt.Printf("Prime_Count: %v ; prime: %v; \n",count,num)
}//利用Sqrt 判断是否素数
func is_prime_v2(num int) bool {nSqrt :=int(math.Sqrt(float64(num)))//fmt.Printf("nSqrt:%v \n",nSqrt)//从2遍历到n的方根,看看是否有因子for i := 2; i<= nSqrt ; i++ {if num%i == 0 {return false}}return true
}

高效实现 求countPrimes

首先从2开始
我们知道 2 是一个素数,那么 2 × 2 = 4, 3 × 2 = 6, 4 × 2 = 8... 都不可能是素数了。
然后我们发现3也是素数,那么 3 × 2 = 6, 3 × 3 = 9, 3 × 4 = 12... 也都不可能是素数了

/*
高效实现 countPrimes
首先从2开始,我们知道 2 是一个素数,那么 2 × 2 = 4, 3 × 2 = 6, 4 × 2 = 8... 都不可能是素数了。
然后我们发现 3 也是素数,那么 3 × 2 = 6, 3 × 3 = 9, 3 × 4 = 12... 也都不可能是素数了。
*/
func TestIsPrimeV3(t *testing.T) {fmt.Printf("Prime_Count: %v ; prime: %v; \n",prime_count(num),num)
}
func prime_count(num int) int{bools := make([]bool,num)for i:=0; i<num ;i++ {bools[i]=true}for i:=2; i*i < num; i++{if bools[i] {for j:=i*i; j < num; j+=i {bools[j] = false}}}count:=0for  i:= 2; i < num; i++{if bools[i] {count++}}return count
}

代码可执行

package algorithmProjectimport ("fmt""math""testing"
)
var num=1000000/*
什么是素数?素数也叫质数,是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。判断素数的方法:思路一:判断一个数是否素数,只需要把m 被 2~m-1之间的每一个整数去除,如果都不能被整除,那么m就是一个素数。思路二:用n分别去除2到sqrt(n)-1,如果能被整除,则表明此数不是素数,反之是素数。
*///暴力判断 时间复杂度O(n^2)
func TestIsPrime(t *testing.T) {count:=0for i:=2; i< num ;i++  {if is_prime(i){count++}}fmt.Printf("Prim_Count: %v ; prime: %v; \n",count,num)
}
//暴力判断
func is_prime(num int) bool {//从2遍历到n-1,看看是否有因子for i := 2; i < num; i++ {if num %i == 0 {//发现一个因子被整除return false}}return true
}/*利用sqrt平方根方法求素数的个数,例如 num =12 能够发现12 = 2 × 612 = 3 × 412 = sqrt(12) × sqrt(12)12 = 4 × 312 = 6 × 2可以看到,后两个乘积就是前面两个反过来,反转临界点就在 sqrt(n)。也就是说,如果在 [2,sqrt(n)] 这个区间之内没有发现可整除因子,就可以直接断定 n 是素数了,因为在区间 [sqrt(n),n] 也一定不会发现可整除因子。函数的时间复杂度降为 O(sqrt(N))*/
func TestIsPrimeV2(t *testing.T) {fmt.Printf("nSqrt:%v \n",math.Sqrt(float64(num)))count:=0for i:=2; i< num; i++  {if is_prime_v2(i){//fmt.Printf("prime : %v \n",i)count++}}fmt.Printf("Prime_Count: %v ; prime: %v; \n",count,num)
}//利用Sqrt 判断是否素数
func is_prime_v2(num int) bool {nSqrt :=int(math.Sqrt(float64(num)))//fmt.Printf("nSqrt:%v \n",nSqrt)//从2遍历到n的方根,看看是否有因子for i := 2; i<= nSqrt ; i++ {if num%i == 0 {return false}}return true
}/*
高效实现 countPrimes
首先从2开始,我们知道 2 是一个素数,那么 2 × 2 = 4, 3 × 2 = 6, 4 × 2 = 8... 都不可能是素数了。
然后我们发现 3 也是素数,那么 3 × 2 = 6, 3 × 3 = 9, 3 × 4 = 12... 也都不可能是素数了。
*/
func TestIsPrimeV3(t *testing.T) {fmt.Printf("Prime_Count: %v ; prime: %v; \n",prime_count(num),num)
}
func prime_count(num int) int{bools := make([]bool,num)for i:=0; i<num ;i++ {bools[i]=true}for i:=2; i*i < num; i++{if bools[i] {for j:=i*i; j < num; j+=i {bools[j] = false}}}count:=0for  i:= 2; i < num; i++{if bools[i] {count++}}return count
}

结果验证

Golang 实现求素数【 输入N,求N内素数个数 】相关推荐

  1. 输入两个正整数m和n,求出[m,n]区间的所有素数。

    描述 输入两个正整数m和n,求出[m,n]区间的所有素数. 输入 两个整数m和n(1<m<n) 输出 [m,n]区间的所有素数,每个素数之前有一个空格 #include <stdio ...

  2. 输入一个正整数求所有素数因子_一起来聊聊素数的两个性质

    素数(prime number),又称质数,有无限个. 定义:在大于1的自然数中,除了1和它本身以外不再有其他因数. 来介绍两个简单的性质: 质数的个数是无穷的. 欧几里得的<几何原本>曾 ...

  3. python acm 素数个数_湘潭大学OJ-1098求区间内素数个数问题

    求区间内素数个数问题 题目描述 Description 给定两个非负整数a,b,其中0<= a,b<=1,000,000,请计算这两个数之间有多少个素数.限制:Time Limit : 1 ...

  4. 7-176 求n以内最大的k个素数以及它们的和 (20 分)

    7-176 求n以内最大的k个素数以及它们的和 (20 分) 本题要求计算并输出不超过n的最大的k个素数以及它们的和. 输入格式: 输入在一行中给出n(10≤n≤10000)和k(1≤k≤10)的值. ...

  5. python基础练习题(按条件对指定序列求和,打印99乘法表、求斐波那契数列、百马百担、求水仙花数、求n以内的所有质数(素数)和)、集合的讲解、一些公关方法

    1.求100(含100)以内所有偶数的和 range(start,end,step)这个序列生成器,和那个切片的语法一样,含头不含尾,step是步长,这里就不需要在对j进行判断了,对于这些简单求奇数和 ...

  6. 统计素数并求和 / 求奇数和

    练习4-11 统计素数并求和   (20分) 本题要求统计给定整数MM和NN区间内素数的个数并对它们求和. 输入格式: 输入在一行中给出两个正整数MM和NN(1\le M\le N\le 5001≤M ...

  7. python求m和n之间的所有素数_C语言求助,《求m和n之间的所有素数》

    题目: C语言求助,<求m和n之间的所有素数> [问题描述] 输入两个正整数m和n(m≥1,n≤500),输出m和n之间的所有素数,每行输出6个。素数是指只能被1和自身整除的正整数,最小的 ...

  8. python找素数程序_求素数python

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 质数(prime number),又称素数,指在大于1的自然数中,除了1和该数自 ...

  9. 求500以内的10个最大素数及其和,并分别输出这10个最大素数及其和。

    求500以内的10个最大素数及其和,并分别输出这10个最大素数及其和. 要求10个素数按从大到小的顺序输出.(不经循环计算,直接输出计0分)输入格式: 无 输出格式: 10个最大素数的输出格式:&qu ...

  10. 7-3 求n以内最大的k个素数以及它们的和

    7-3 求n以内最大的k个素数以及它们的和 本题要求计算并输出不超过n的最大的k个素数以及它们的和. 输入格式: 输入在一行中给出n(10≤n≤10000)和k(1≤k≤10)的值. 输出格式: 在一 ...

最新文章

  1. LeetCode刷题记录12——232. Implement Queue using Stacks(easy)
  2. webstorm git 怎么断开版本控制 webstorm git for windows 禁止 自动运行
  3. 深入理解Java对象序列化
  4. 抖音提示需要转换为mp4_如何将MP4文件转换为MP3格式?万兴优转帮你轻松完成转换...
  5. 深入理解.NET Core的基元(二) - 共享框架
  6. P3700 [CQOI2017]小Q的表格(反演、分块)
  7. 回调函数这个是什么鬼?
  8. 【干货】卷积神经网络Alex-Net、VGG-Nets、Network-In-Network案例分析
  9. 检查和变异可查询表达式树
  10. mysql中文版下载_mysql数据库下载
  11. win8笔记本关闭小键盘
  12. rabbitmq3.7.3 发布了一个新的 exchange x-random
  13. 2021-08-17Cookie 详解
  14. MongoDB 安全与认证
  15. 第 7 章 Neutron - 079 - 在 ML2 中 enable local network
  16. linux下安装字体
  17. zigbee协议重要英文缩写
  18. java计算机毕业设计河南省农村多元化养老服务管理系统设计与实现源码+mysql数据库+系统+lw文档+部署
  19. 计算机三种校验方式,三种校验码
  20. python 操作微信_利用 Python 实现微信半自动化操作

热门文章

  1. 《天天数学》连载14:一月十四日
  2. mysql的建库建表语句_SQL语句(建库、建表、修改语句)
  3. 向前logistic回归与向后筛选出一样的变量_什么泊松分布?泊松回归又能做什么?...
  4. 【英语学习】【English L06】U07 Jobs L2 I have my own bakery now
  5. python函数式编程思想_python函数式编程
  6. mysql8.0.11密码_mysql8.0.11安装和修改密码(转载)
  7. 通过Keepalived实现Redis Failover自动故障切换功能
  8. okhttp请求php接口,安卓:okhttp请求,获取返回数据
  9. Java:实验四第6题
  10. php程序里的configini_PHP: 配置文件 - Manual