------------恢复内容开始------------
求一个数是否为素数有很多求解方法下面列出几个供参考
一、普通求法
思路:用循环来求,从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];//相当于桶排序,将原先已经记录的素数标记,