浅谈线性素数筛

  素数筛的用处还是蛮多的,有很多和素数有关的题都要用到素数筛,所以有一个高效的筛法自然是非常好的吖,普通筛法(暴力筛法)就不说了,因为有了高效的也没人在会用普通筛法了吧。

  线性素数筛是用每一个合数的最小的质因数筛掉它,这个体现在代码里的  if(i%prime[j]==0)break;  这句话里,因为如果这里不跳出的话,j会继续向上枚举,这时i*peime[j]的最小的质因数是之前的那个prime[j]而不是现在的prime[j],而一旦出现这样的情况,就不能保证每个数都被自己最小的质因数筛掉。而加上了那句话之后,时间复杂度保证就是线性的。

  模板:https://www.luogu.org/problemnew/show/P3383

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 int n,m;
 5 bool vis[10000003];
 6 int prime[1000003];
 7 int cnt;
 8 int main()
 9 {
10     scanf("%d%d",&n,&m);
11     vis[0]=vis[1]=1;
12     for(int i=2;i<=n;++i)
13     {
14         if(!vis[i])prime[++cnt]=i;
15         for(int j=1;j<=cnt&&i*prime[j]<=n;++j)
16         {
17             vis[i*prime[j]]=1;
18             if(i%prime[j]==0)break; 
19         }
20     }
21     while(m--)
22     {
23         int x;
24         scanf("%d",&x);
25         if(!vis[x])printf("Yes\n");
26         else printf("No\n");
27     } 
28     return 0;
29 }
View Code

  还有一个叫做区间素数筛的东西,窝也是前几天才知道的,不过不是线性的,或许有线性的写法吧,不太会,但是复杂度也不是很高。

 1 #include<iostream>
 2 #include<cstdio>
 3 #define ll long long 
 4 using namespace std;
 5 const int maxn=1000005;
 6 bool b1[maxn],b2[maxn];
 7 ll prime[maxn];
 8 ll cnt;//区间素数筛的原理:(a,b)区间的合数的最小质因数一定小于sqrt(b),\
 9 //所以把2到sqrt(b)的素数筛出来,蓝后,用他们把他们在a到b的倍数筛出来 
10 int main()
11 {
12     ll a,b;
13     scanf("%lld%lld",&a,&b);b++;
14     for(ll i=0;i*i<b;++i)b2[i]=1;
15     for(int i=0;i<b-a;++i)b1[i]=1;
16     for(ll i=2;i*i<b;++i)
17     {
18         if(b2[i])
19         {
20             for(ll j=2*i;j*j<b;j+=i)b2[j]=0;
21             for(ll j=max(2ll,(a+i-1)/i)*i;j<b;j+=i)b1[j-a]=0;
22         }
23     }
24     for(ll i=0;i<b-a;++i)
25         if(b1[i])prime[cnt++]=a+i;
26     printf("%d\n",cnt);
27 }
View Code

 

转载于:https://www.cnblogs.com/yuelian/p/8758876.html

资源下载链接为: https://pan.quark.cn/s/f989b9092fc5 在 Android 应用开发中,开发一款仿 OPPO 手机计算器的应用是极具实践价值的任务,它融合了 UI 设计、事件处理以及数学逻辑等多方面的技术要点。当前的“最新版仿 OPPO 手机计算器--android.rar”压缩包中,提供了该计算器应用的源代码,这为开发者深入学习 Android 编程提供了宝贵的资源。 UI 设计是构建此类计算器应用的基石。OPPO 手机的计算器界面以清晰的布局和良好的用户交互体验著称,其中包括数字键、运算符键以及用于显示结果的区域等关键元。开发者需借助 Android Studio 中的 XML 布局文件来定义这些界面元,可选用 LinearLayout、GridLayout 或 ConstraintLayout 等布局管理器,并搭配 Button 控件来实现各个按键功能。同时,还需考虑不同分辨率屏幕和设备尺寸的适配问题,这通常涉及 Density Independent Pixel(dp)单位的应用以及 Android 尺寸资源的合理配置。 事件处理构成了计算器的核心功能。开发者要在每个按钮的点击事件中编写相应的处理代码,通常通过实现 OnClickListener 接口来完成。例如,当用户点击数字键时,相应的值会被添加到显示区域;点击运算符键时,则会保存当前操作数并设定运算类型。而对于等号(=)按钮,需要执行计算操作,这往往需要借助栈数据结构来存储操作数和运算符,并运用算法解析表达式以完成计算。 数学逻辑的实现则是计算器功能的关键体现。在 Android 应用中,开发者可以利用 Java 内置的 Math 类,或者自行设计算法来完成计算任务。基本的加减乘除运算可通过简单的算术操作实现,而像求幂、开方等复杂运算则需调用 Math 类的相关方法。此外
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值