素数(质数)判断+最小公倍数的四种方法

目录

 一、素数判断:

定义:大于1且仅能被1和自身整除的整数为素数(质数)。

一、暴力求解法

二、对判断范围优化

三、对数字做判断优化

四、用六判断

二、最小公倍数

定义:最小公倍数*最大公约数=两数之积

一、辗转相除法

二、穷举法

三、更相减损法

 


 一、素数判断:

定义:大于1且仅能被1和自身整除的整数为素数(质数)。

一、暴力求解法

对于数字n,直接从2到n-1,逐一试除,一旦被整除则不是素数,但要注意2也是素数。


bool isPrime_1(int n)
{
	if (n == 2) //2需要单独判断
		return true;
	for (int i = 2; i < n; i++)
	{
		if (n%i == 0)
			return false;
	}
	return true;
}

二、对判断范围优化

对于数字n,如果在n^(1/2)之前(包括n^(1/2))就被整除,则n也必被整除.这样缩小了范围,提高了效率。

bool isPrime_2(int n)
{
	if (n == 2) 
		return true;
	for (int i = 2; i <=sqrt(n); i++) 
	{
		if (n%i == 0)
			return false;
	}
	return true;
}

三、对数字做判断优化

我们知道,除2以外的所有偶数必不是素数。那么可以这样优化。

bool isPrime_3(int n)
{
	if (n == 2)
		return true;
	if (n % 2 == 0)
		return false;
	for (int i = 3; i <= sqrt(n); i += 2)//跳过偶数
	{
		if (n%i == 0)
			return false;
	}
	return true;
}

这样效率就大大提升了。

四、用六判断

 bool isPrime_4(int n) 
 {
	if (n <= 3) //小于3且大于一
		return n > 1;
	if (n % 6 != 1 && n% 6 != 5) 
		return false;
	for (int i = 5; i <= sqrt(n); i += 6)
	{
		if (n % i == 0 || n % (i + 2) == 0)
			return false;
	}
	return true;
}

对大于大于五的数,有6n+1,6n+2,6n+3,6n+4,6n+5,其中6n+2,6n+3,6n+4皆有第三个数可以让其整除,所有当n%6不为1或5时不为素数,而25前的数开根后比5小以已被判断完毕,进入循环后加一步n%(i+2)表示可被3整除的,也就是方法3的进一步扩展。

目前暂未深入学习数据结构与算法,还有更高效率的方法用于判断。感兴趣的可以自行探索.

二、最小公倍数

定义:最小公倍数*最大公约数=两数之积

一、辗转相除法

int gcd(int a,int b)
{
    if(a%b==0)
        return b;
    else
        return gcd(b,a%b);
}

二、穷举法

 

int gcd(int a,int b)
{
    a=max(a,b);
    b=min(a,b);
    int tmp=a;
    while(a%b!=0)
    {
        a+=tmp;
    }
    return a;
}

三、更相减损法

int gcd(int m,int n)
{
	int i=0,temp,x;
	while(m%2==0 && n%2==0)
	{
		m/=2;
		n/=2;
		i+=1;
	}
	if(m<n) 
        swap(m,n);
	while(x)
	{
		x=m-n;
		m=(n>x)?n:x;
		n=(n<x)?n:x;
		if(n==(m-n))
			break;
	}
	if(i==0)
		return n;
	else 
	    return (int )pow(2,i)*n;
}

 

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

...404 Not Found

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值