判断素数的几种方法

本文探讨了两种判断素数的方法:从定义出发的基本判断和优化后的判断,后者利用了数学性质仅遍历到平方根。通过示例,解释了如何在100~200区间内找出素数,并强调了算法效率的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、从定义来判别

1、定义

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

2、实现方法

通过对定义的分析,我们知道判断素数就需要对所有比这个数(我们假定为数字 n n n )小的数进行除法运算,为了实现这个目的我们就需要进行一次遍历,判断是否有除 1 1 1 n 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 flag 来记录循环是否正常结束,这是一种较直观的方法。其实我们还可以通过 i i i 的值,来进行判断,这两种都是很简单的。

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

3、小结

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

二、修改后的判断

1、思路

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

2、实现方法

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

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

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

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

3、小结

实际上我们仅仅只是修改了所需要遍历的范围,效率就已经得到了很大的提升。如果 n n n 还是一个 10 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 也有必要进行一次运算,因为 n \sqrt n n 也有可能是 n n n 的因数。 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值