线性筛,求质数(素数)

#include <bits/stdc++.h> //万能库
using namespace std;
typedef long long ll; //把long long 用 ll表示,节约书写时间
int const maxn=1e5+5; //定义一个数值maxn为100005
ll prime[maxn]; //存储质数的数组
bool check[maxn]; //用来检查是否质数的倍数被筛出来的数组
void primelist(ll n) //获得质数表的函数 注意:筛选的是小于n的所有质数
{
ll cnt=0; //用来记录质数的数量
memset(check,false,sizeof(check)); //先将bool类型check数组每一位置为false
for(int i=2;i<n;++i) //开始从第一位质数开始,如果是就记录在prime数组中
{
if(!check[i]) //如果这一位没有被标记过,证明这个数是质数
{
prime[++cnt]=i; //把这个数搞进质数表中 同时 质数数量+1
}
for(int j=1;j<=cnt;j++) // 开始遍历,把当前质数的倍数都筛掉 ——>意味着 bool类型数组check置为true这样以后就不会把质数的倍数保存到质数表中
{
if(i*prime[j]>n)break; //如果超过一开始的数值n了就退出循环
check[i*prime[j]]=true; //标记操作
}
}
}

int main()
{
ios::sync_with_stdio(false);// 想了解此语句的复制此语句百度即可
ll n;
cin>>n;
primelist(n); //调用primelist函数,获得小于n的质数表
for(int i=1;i<10;i++) //此处演示打印前10位质数
{
cout<<prime[i]<<" ";
}
return 0;
}

————————————————
版权声明:本文为CSDN博主「upczsh」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_43850598/article/details/98224082

例题:

链接:https://ac.nowcoder.com/acm/contest/8440/G
来源:牛客网

题目描述

总所周知,每个人都有自己的幸运数字,而管管的幸运数字是除了1和它自身外,不能被其他自然数整除的数,管管现在有T次询问,每次询问会给定一个数字N,你需要告诉他N是不是他的幸运数字,如果不是,需要你告诉他离N最近的幸运数字L与N差的绝对值 即|L-N|。

输入描述:

第一行含有一个整数 T (T≤100)(T\le 100)(T100) 表示询问次数。
对于每次询问,第一行含有一个整数 N (1<N≤10000)(1\lt N \le 10000)(1<N10000)表示管管向你询问的数字。

输出描述:

对于每次询问,如果N是管管的幸运数字则输出YES,否则输出离N最近的幸运数字L与N差的绝对值|L-N|。
示例1

输入

复制
3
3
4
10

输出

复制
YES
1
1

#include<cstdio>
using namespace std;
typedef long long ll;
const ll maxn=1e6+10;
const ll mod=1e9+7;

int T,N;

bool isprime[maxn];
int prime[maxn/10],m;
void primes() //线性筛
{
isprime[0]=isprime[1]=true;
for(int i=2;i<maxn;i++)
{
if(!isprime[i])
prime[++m]=i;
for(int j=1;i*prime[j]<maxn && j<=m;j++)
{
isprime[i*prime[j]]=true;
if(i%prime[j]==0) break;
}
}
}

int main()
{
scanf("%d",&T);
primes();
while(T--)
{
scanf("%d",&N);
if(!isprime[N]) //N是质数
{
printf("YES\n");
continue;
}
int l=0,r=m,mid,tt;
while(l<=r)
{
mid=(l+r)>>1;
if(prime[mid]<=N)
{
tt=mid;
l=mid+1;
}
else
{
r=mid-1;
}
}
int at=N-prime[tt]; //左边的质数与N的距离
int bt=prime[tt+1]-N; //右边的质数与N的距离
if(at>bt) printf("%d\n",bt);
else printf("%d\n",at);
}
return 0;
}
————————————————
版权声明:本文为CSDN博主「一脸呆滞」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45920333/article/details/109344802

BOOL类型数组初始化

一般初始化为true或者false。
赋值方式为:
(1)如果赋值全为true:
bool boolArray[16];
memset(boolArray, 1, 16 * sizeof(bool));
1
2
(2)如果赋值全为false:

bool boolArray[16] = {0};
1
注意:

bool boolArray[16] = {1}; // 这种方式只会将第一个bool值初始化为true,其他都是false。

注意:bool 完后默认是false!int类型:如果是定义的全局变量或者静态变量,未初始化的话就是0.如果是局部变量,那就是以前残留在堆栈里的随机值。
————————————————
版权声明:本文为CSDN博主「LessIsMore-」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xueyuquan/article/details/112788510

posted @ 2021-10-09 17:26  Night_Voyager-qaq  阅读(82)  评论(0编辑  收藏  举报
Live2D