判断素数的方法

判断素数的方法

素数的定义:一个大于1的自然数,除了1和它本身外,不能被其他自然数整除的素数叫素数。

方法一:

单独判读输入的数n是不是1和2,再从2到n-1判断是否存在能被2整除的数,如果有就是素数,没有就不是素数。
核心代码如下:

#include<stdio.h>
func(int n)
{
 if(n<=1)
  return 0;
 else if(n==2)
  return 1;
 else {
   for(int i=2;i<n;i++)
   {
    if(n%i==0)
     return 0;
   }
   return 1;
      }
}
int main() 
{
 int n;
 scanf("%d",&n);
 if(func(n))  printf("是素数");
 else printf("不是素数"); 
}

其中优化的一个方法就是对于一个正整数n,如果用二到根号n之间的整数去除,均无法整除,则为素数,否则就不是素数。
此方法就是将上面的for循环稍微改变一下,再加上#include<math.h>。
改变如下:

for(int i=2;i<sqrt(n);i++)
   {
    if(n%i==0)
     return 0;
   }
   return 1;
      }

方法二:筛选法

找一个范围内的所有的素数,从这个范围的第一个数起,将这个数的所有倍数都置0,再将下一个非0的数的倍数都置0。
例如找2-200内的所有素数:
1.首先先定义一个数组a[],将2-200放入a[2]~a[200]中去。
2.第一个数是素数,将后面2的整数倍的数全部筛去,筛去的置0。
3找出下一个非0的数字a[i],它就是新的素数i。
4.筛去i的整数倍,置0。
5.若i小于200的平方根,则继续寻找下一个非0数。否则输出2~200之间的素数。
#include<stdio.h>
#include<math.h>
int main()
{
 int i,j,n,a[201];
 for(i=2;i<=200;i++)
  a[i]=i;      // 将数字放入数组
 for(i=2;i<=sqrt(200);i++)
 {
  if(a[i]!=0)
  {
   for(j=i+i;j<=200;j+=i)
    a[j]=0;   //将i的倍数置0
  }
 }
 for(i=2;i<200;i++)//输出
  if(a[i])
   printf("%5d",i);
}

方法三:6素数法

5以内只有1,2,3,5是素数,我们将在100以内的素数列出,发现它们都在6的倍数的左右。
例:
(5,6,7),(11,12,13),(17,18,19)(23,24,**25**),(29,30,31),(**35**,36,37),(41,42,43),(47,48,49),
我们将会发下在6的倍数的左右两边除了5 的倍数以外的数为素数。
而在100以内大于5的数字内除去6的倍数的左右两边的数字后,剩下的数字为8,9,10,14,15,16,20,21,22,26,27,28.......以此类推,我们不难发现这些数字均为2或3的倍数。
综上所述,我们要筛去2,3,5的倍数,然后6左右的数便为素数。
代码如下:
#include<stdio.h>
#include<math.h>
int func(int x)
{
	if(x<=1)	
		return 0;
	if(x==2||x==3||x==5)
		return 1;
	if(x%2==0||x%3==0||x%5==0)
		return 0;
	for(int i=6;i<=sqrt(x);i+=6)
	{
	   if(x%(i-1)==0||x%(i+1)==0)
	   	return 0;
	   return 1;
	 }
}
int main()
{
   int n;
   scanf("%d",&n);
   if(func(n))	printf("是");
   else       printf("不是");		
   return 0;
 }

第一次写,如果有什么不对请大佬指出,谢谢。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值