一、从定义来判别
1、定义
素数除了数字 和本身之外不能被其他任何的数字除尽。显然,最简单的判断办法就是判断 到这个数本身之间是否有能将这个数整除的数存在,如果不存在,则它就是素数,否则不是素数。
2、实现方法
通过对定义的分析,我们知道判断素数就需要对所有比这个数(我们假定为数字 )小的数进行除法运算,为了实现这个目的我们就需要进行一次遍历,判断是否有除 和 之外的因数。遍历我们就通过一个 for循环1来实现。具体如下:
int i, n, flag;
for (i = 2, flag = 1; i < n; i++)
{
//如果有能整除的数,则n不是素数,循环结束
if (n%i == 0)
{
flag = 0;
break;
}
}
//判断内层循环是否正常结束
if (flag)
{
printf("%d是素数\n", n);
}
else
{
printf("%d不是素数\n", n);
}
在上方我使用了一个标记 来记录循环是否正常结束,这是一种较直观的方法。其实我们还可以通过 的值,来进行判断,这两种都是很简单的。
//判断内层循环是否正常结束
if (i == n)
{
printf("%d是素数\n", n);
}
else
{
printf("%d不是素数\n", n);
}
3、小结
通过定义来判断素数是很简单的,但是它的效率也不会很高。如果 是 位数,那么将会进行十亿次以上的运算。
二、修改后的判断
1、思路
在上面我们知道了如果
是一个很大的数,那么程序也会进行很多次运算。那么有没有什么办法去减少运算的次数呢?
显然,我们很容易就能想到:如果要算一个数
的因数,只需要算小于
的所有数是否是
的因数就可以了。
2、实现方法
为了能够求得 ,我们需要知道。
我们可以使用sqrt函数,它是头文件 math.h 中的函数.
#include <math.h>
好了,现在我们看看修改后2的效果。
for (i = 2; i <= sqrt(n); i++)
{
//如果有能整除的数,则n不是素数,循环结束
if (n%i == 0)
{
break;
}
}
3、小结
实际上我们仅仅只是修改了所需要遍历的范围,效率就已经得到了很大的提升。如果 还是一个 位数,现在就只需要进行上万次的运算。
三、具体问题中的素数
1、打印100~200之间的素数
在这个问题中,我们可以很快发现:我们只需要对 100 ~ 200 之间的数进行一个遍历就可以轻松的完成本题。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
int num, i;
for (num = 100; num <= 200; num++)
{
for (i = 2; i <= sqrt(num); i++)
{
//如果有能整除的数,则不是素数
if (num%i == 0)
{
break;
}
}
//判断内层循环是否正常结束
if (i > sqrt(num))
{
printf("%d是素数\n", num);
}
}
system("pause");
return 0;
}
2、思考
判断素数只是一个很基础的问题,但我还是有很多收获。显然,我们还能对如何判断素数进行很多改进,今后如果有机会,我还会对此进行修改。