这算是一篇以入门级的方式来判断素数的文章,因为博主也是一位刚入门的小白,写这些东西主要还是为了巩固自己所学,也算是对自己的成长的一种记录。废话不多说,进入正题:
一·什么是素数?
首先我们要知道素数,通俗的话来讲 除了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的倍数的左右两侧),那一种方法的用时少于此方法。
五·总结
用了一种较简便的方法来解决素数问题,当然这只是最基础的东西,素数问题可以有很多变式,这里不再一 一列举,但是万变不离其宗,开始之前写下判断素数的函数准没错。