判断素数的若干方法

素数定义: 素数又称质数。一个大于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种你不知道的素数的判断方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值