求一个数是素数

------------恢复内容开始------------

求一个数是否为素数有很多求解方法下面列出几个供参考

一、普通求法

思路:用循环来求,从2开始循环一直到根号n。

   为什么只需要判断到根号n?

因为n=√n*√n,n的因数除了√n,其他都是成对存在的,且必定一个大于√n一个小于√n,

假设n不是质数,有个因数大于√n(不是n本身),则n必定有一个与之对应的小于√n的因数。这个比较简单。

时间复杂度为O(n)。

#include<bits/stdc++.h>
using namespace std;
int sushu(int n)
{
   
  if(n==1) return 0;
  int k;
  k=sqrt(n);
  for(int i=2;i<=k;i++)
  {
   
    if(n%i==0) return 0;
  }
  return 1;
}
int main()
{
   
  int n;
  while(cin>>n)
  {
   
    int l=sushu(n);
    if(l) printf("ture\n");
    else
    {
   
      printf("no\n");
    }
  }
  return 0;

}

二、用素数筛来判断。(这个可能有点大材小用了,但对于大的数据还是可以的)

 素数筛可以分为埃及筛和线性筛。

1、埃及筛。

和数的倍数一定会在筛素数倍数的时候被筛掉,所以只筛素数就好,只把质数的素数筛掉。就是找到一个质数,把他的倍数全部标记为合数。但是你会发现有的数字会被标记多次,比如12被2,3都标记,但是这样会浪费时间。(一般的话,如果数据是1e9的话,用这个就行了,时间复杂度是nloglogn)。

     下面给出模板:
const int N=1e7+1;
int prime[N];//打表,将素数弄成表格,就是将范围内的所有素数记录下来
int b[N];//相当于桶排序,将原先已经记录的素数标记,
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值