判断素数的几种方法

一、从定义来判别

1、定义

素数除了数字 1 1 和本身之外不能被其他任何的数字除尽。显然,最简单的判断办法就是判断 1 1 到这个数本身之间是否有能将这个数整除的数存在,如果不存在,则它就是素数,否则不是素数。

2、实现方法

通过对定义的分析,我们知道判断素数就需要对所有比这个数(我们假定为数字 n n )小的数进行除法运算,为了实现这个目的我们就需要进行一次遍历,判断是否有除 1 1 n n 之外的因数。遍历我们就通过一个 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);
  }

在上方我使用了一个标记 f l a g flag 来记录循环是否正常结束,这是一种较直观的方法。其实我们还可以通过 i i 的值,来进行判断,这两种都是很简单的。

  //判断内层循环是否正常结束
  if (i == n)
  {
   	printf("%d是素数\n", n);
  }
  else
  {
   	printf("%d不是素数\n", n);
  }
  

3、小结

通过定义来判断素数是很简单的,但是它的效率也不会很高。如果 n n 10 10 位数,那么将会进行十亿次以上的运算。

二、修改后的判断

1、思路

在上面我们知道了如果 n n 是一个很大的数,那么程序也会进行很多次运算。那么有没有什么办法去减少运算的次数呢?
显然,我们很容易就能想到:如果要算一个数 x x 的因数,只需要算小于 x \sqrt x 的所有数是否是 x x 的因数就可以了。

2、实现方法

为了能够求得 n \sqrt n ,我们需要知道。

我们可以使用sqrt函数,它是头文件 math.h 中的函数.
#include <math.h>

好了,现在我们看看修改后2的效果。

  for (i = 2; i <= sqrt(n); i++)
  {
  	//如果有能整除的数,则n不是素数,循环结束
    	if (n%i == 0)
    	{
     		break;
    	}
  }
  

3、小结

实际上我们仅仅只是修改了所需要遍历的范围,效率就已经得到了很大的提升。如果 n n 还是一个 10 10 位数,现在就只需要进行上万次的运算。

三、具体问题中的素数

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、思考

判断素数只是一个很基础的问题,但我还是有很多收获。显然,我们还能对如何判断素数进行很多改进,今后如果有机会,我还会对此进行修改。


  1. 遍历操作经常使用 for循环来实现,无论是对数组还是链表等,都能具有很好的效果。 ↩︎

  2. 需要注意的是: n \sqrt n 也有必要进行一次运算,因为 n \sqrt n 也有可能是 n n 的因数。 ↩︎

猜你喜欢

转载自blog.csdn.net/shiawaseli/article/details/88573733
今日推荐