素数定义: 素数又称质数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。
大前提:
1.小于等于1的数既不是合数也不是素数。因为概念不包含此范围内的数。
2.2只能被1和2整除,显然为素数。
定义法(暴力穷举)
根据素数的定义。素数是大于1的自然数,除了1和自身外,其它数都不是它的因子。所以可以用一个循环,从2开始遍历到该数减去1,如果这个数都不能被整除,那么这个数就是素数。
也就是说:
将待判断整数a(a>=2) ,依次除以整数 b(b∈[2, a- 1],如果 a % b != 0 , n 可判定其是素数。
代码实现:
c是辅助变量,初值为0,如果是合数,会将c赋值为1;跳槽本次循环后,再赋值为0;可根据c的最终值判断是否是素数;
package main
import (
"fmt"
)
func main() {
/*
a:待判断的数字
b:大于等于2的因子
c:辅助变量用于判断素数
*/
var a, b, c int
for a = 2; a <= 50; a++ {
for b = 2; b <= a-1; b++ {
if a%b == 0 {
c = 1
break
}
c = 0
}
if c == 0 {
fmt.Printf("%d \n", a)
}
}
}
优化穷举1
进一步思考,有必要遍历到 a - 1 吗?如果合数的最小因子是2(大部分),那么最大因子就是 a/2。即使最小因子大于2,那么最大因子也一定小于a/2。我们只需遍历[2,a/2],就能判断是否是素数。
代码实现:
package main
import (
"fmt"
)
func main() {
/*
a:待判断的数字
b:大于等于2的因子
c:辅助变量用于判断素数
*/
var a, b, c int
for a = 2; a <= 50; a++ {
for b = 2; b <= (a/2); b++ {
if a%b == 0 {
c = 1
break
}
c = 0
}
if c == 0 {
fmt.Printf("%d \n", a)
}
}
}
优化穷举2
事实上,a的因子分为两部分,一部分因子大于a的平方根,一部分小于a的平方根,而两部分是一一对应的,因此只判断从2到平方根的数字是否都能被整除即可。
代码实现:
package main
import (
"fmt"
"math"
)
func main() {
var a, b, c int
for a = 2; a <= 50; a++ {
for b = 2; b <= int(math.Sqrt(float64(a))); b++ {
if a%b == 0 {
c = 1
break
}
c = 0
}
if c == 0 {
fmt.Printf("%d \n", a)
}
}
}
优化穷举3
事实上,假设b是合数a的一个因子,根据定义可知,则a/b是a的另一个因子,且两个因子必然有一大一小。根据优化穷举方法1中的原理可知,对于特定因子b,另一个因子不可能大于a/b,因此只需遍历到a/b,故总体而言我们只需遍历[2,a/b],就能判断是否是合数。
代码实现:
package main
import (
"fmt"
)
func main() {
var a, b, c int
for a = 2; a <= 50; a++ {
for b = 2; b <= a/b; b++ {
if a%b == 0 {
c = 1
break
}
c = 0
}
if c == 0 {
fmt.Printf("%d \n", a)
}
}
}
参考:
5种你不知道的素数的判断方法