标签:质数 times Golang 素数 var 100 main sum
一、任务要求
输出100以内的质数,并将质数求和,每行显示5个质数
质数:(质数prime number)定义为在大于1的自然数中,除了1和它本身以外不再有其他因数,质数有无穷多个。
二、思考过程
因为质数只能被1和自己整除,所以要输出100以内质数,最简单粗暴的方式就是用除数X,被除数2 ~ (X-1)之间求余,如余数有为0,则X不是质数。用count记录余数为0的次数,用sum统计所有质数之和,用times记录每行已经输出质数的次数,times为0则输出换行 指令,然后重新赋值次数。
三、代码
package main import ( "fmt" ) func main() { var times = 5 var sum int for i := 2; i <= 100; i++ { var count int for j := 2; j <= i-1; j++ { if i%j == 0 { count++ } } if count == 0 { fmt.Printf("%v ", i) times-- sum += i } if times == 0 { fmt.Println() times = 5 } } fmt.Printf("质数之和为:%v", sum) } //输出结果为: //2 3 5 7 11 //13 17 19 23 29 //31 37 41 43 47 //53 59 61 67 71 //73 79 83 89 97 //质数之和为:1060
四、更优方案
开根号法:从2到n均整除判断,时间复杂度O(n)(原因:素数是因子为1和本身, 如果数c不是素数,则还有其他因子,其中的因子,假如为a,b.其中必有一个大于sqrt(c) ,一个小于sqrt(c) 。所以m必有一个小于或等于其平方根的因数,那么验证素数时就只需要验证到其平方根就可以了。即一个合数一定含有小于它平方根的质因子。
package main import ( "fmt" "math" ) func main() { var times = 5 var sum int for i := 2; i <= 100; i++ { var count int for j := 2; j <= int(math.Floor(math.Sqrt(float64(i)))); j++ { if i%j == 0 { count++ } } if count == 0 { fmt.Printf("%v ", i) times-- sum += i } if times == 0 { fmt.Println() times = 5 } } fmt.Printf("质数之和为:%v", sum) //输出结果: //2 3 5 7 11 //13 17 19 23 29 //31 37 41 43 47 //53 59 61 67 71 //73 79 83 89 97 //质数之和为:1060 }
标签:质数,times,Golang,素数,var,100,main,sum 来源: https://www.cnblogs.com/CodeMyLifeDhy/p/15851773.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。