小知识系列(2):小白对素数(质数)的判断

这算是一篇以入门级的方式来判断素数的文章,因为博主也是一位刚入门的小白,写这些东西主要还是为了巩固自己所学,也算是对自己的成长的一种记录。废话不多说,进入正题:

一·什么是素数?

首先我们要知道素数,通俗的话来讲 除了1和该数本身,没有一个整数可以被该数整除,那么称该数为素数(质数),1既不是素数也不是合数。那么具体的定义是什么,想要知道的话可以自行百度。

二·如何去思考?

①很容易可以知道,2是一个素数(只有1*2可以得到),而且由此也可以知道,2以外的所有偶数都不是素数(因为都可以被2整除,不满足只有1和该数本身),偶数就可以排除掉了(具体操作请看下文)。

除了2以外所有的素数都是奇数(如果再去研究的话会发现,除了2和3所有的奇数都在6及6的倍数的左右两侧,在本篇文章里不会去用这种方法),并且很容易知道奇数不会被偶数整除

三·具体操作

题目:判断一个数是不是素数,如果是输出“Yes”否则输出“No”。
如果不用函数:

#include <stdio.h>
typedef long long ll;
int main()
{	
 	ll a;
 	scanf("%lld",&a);
 	if(a==0||a==1)	
	{
		printf("No");
		return 0;
	}
	if(a%2==0&&a!=2)   //所有非2的偶数都不是素数。
	{
		printf("No");
		return 0;
	}
 	for(int i=3;i*i<=a;i=i+2) //奇数不可能被偶数整除,只考虑除以奇数。
 	{
		if(a%i==0)     	//如果能被整除则不是素数
 		{
 			printf("No");
 			return 0;
		}
	}
	printf("Yes");	//到这里剩下的都是素数了。
	return 0;                     	 
}

如果用函数来做一般还是选择用函数比较方便

#include <stdio.h>
typedef long long ll;

int prime(ll x)	//定义判断素数的函数。
{
	if(x==0||x==1)
		return 0;
	if(x%2==0&&x!=2)
		return 0;
	for(int i=3;i*i<=x;i+=2)
	{
		if(x%i==0)
			return 0;
	 } 
	 return 1;
 } 
int main()
{	
	ll a;
	cin>>a;
	if(prime(a))	//引用函数判断是否为素数。
		printf("Yes");
	else
		printf("No");
	return 0;                     	 
}

实际上思想都是完全一样的,但是函数可以让代码显得更简洁,也方便查找错误。

四·注意事项

①我们用循环来测试能不能被整除的时候用到了i*i<=x.

for(int i=3;i*i<=x;i+=2)
	{
		if(x%i==0)
			return 0;
	 } 

在其他的一些文章上可能是用 i<=sqrt(x)。值得注意的是比较起前者,后者用到了sqrt()函数,所以可能是存在误差的。

那我们为什么要这样写呢?
在OJ上用i<=x会浪费很长的时间导致超时。而其实我们根本不需要去从i到x,而是到x的开方即可。

例如81:我们都知道9*9=81,那么我们可以说9是它最中间的一个数了,如果在9之前有数可以被81整除,那么在9之后一定有一个数相对应(3×27),反之亦然,如果9之后有数可以被81整除,那么在9之前一定有一个数与之对应(27×3),所以可以推断出:如果9之前不存在数可以被81整除,那么9之后就不会存在一个数可以被81整除。
再把这个推断修改一下:如果√x 之前不存在一个数可以被x整除,那么√x之后不会存在一个数可以被x整除。
因此我们只需要考虑√x之前的数即可,即 i * i<=x。

②该方法不是最优,但是比较适合像我这样的小白。最优方法可以参考其他求素数的文章(除了2和3所有的奇数都在6及6的倍数的左右两侧),那一种方法的用时少于此方法。

五·总结

用了一种较简便的方法来解决素数问题,当然这只是最基础的东西,素数问题可以有很多变式,这里不再一 一列举,但是万变不离其宗,开始之前写下判断素数的函数准没错。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值