poj-2689素数筛选
来源:互联网 发布:java runtime 阻塞 编辑:程序博客网 时间:2024/06/05 17:45
这道题目我就不贴题目了,就是素数筛选题。
这道题目差点让我崩溃,自己太菜的原因,提交了很多次,总是runtime error ,后来才知道,素数筛选的范围这能是2^16,然而这道题给的范围超出了int的上界,所以,必须要用另外一种方法来筛选,看了人家的博客,感觉方法超好。这道题有个突破点,就是区间在100000之内,所以,我们找到它们的合子的位置即可。
先筛出50000以内的素数,然后再在给定的区间内以刚刚的素数为基底,筛出区间内的素数。筛的过程中算出区间左值是最小素数的几倍,然后然后不是整数倍,就往前加1(否则算出的数会不在这个区间里,没意义),然后这个整数倍乘以素数已经大于右边了,那就可以直接退出了。
这里写代码#include <iostream>#include <cmath> #include<cstring>using namespace std;const int N=50000;const int Max=999999999;//定义为无穷大int r[1000000],a[N+100],b[N+100],z;int main(){ int l,u,i,j; for (i=2;i<=N;i++)//素数筛选 if (!a[i]) { b[++z]=i; for (j=i+i;j<=N;j+=i) a[j]=1; } while (cin>>l>>u) { memset(r,0,sizeof(r)); int dis,max=-1,min=Max,maxc,minc; for (i=1;i<=z;i++)//关键算法在于这里 { int s,t; s=(l-1)/b[i]+1; t=u/b[i]; for (j=s;j<=t;j++) if (j>1) r[j*b[i]-l]=1; } int k=-1; for (i=0;i<=u-l;i++)//这里就是遍历找相邻最近和最远的,其实这里理解容易些 if (!r[i]) { if (k!=-1) { dis=i-k; if (dis>max) { max=dis; maxc=i+l; } if (dis<min) { min=dis; minc=i+l; } } if (i+l!=1) k=i; } if (max<0) { cout<<"There are no adjacent primes."<<endl; } else { cout<<minc-min<<','<<minc<<" are closest, "; cout<<maxc-max<<','<<maxc<<" are most distant."<<endl; } } return 0;}
希望各位大牛们多多指教!
1 0
- poj-2689素数筛选
- poj 2689(区间素数筛选)
- POJ 2689 (素数的二次筛选)
- poj 2689 线性时间筛选素数
- poj 2689 素数筛选的巧妙使用
- POJ 2689 Prime Distance(筛选两次素数)
- Prime Distance - POJ 2689 素数筛选
- poj 2689 (素数二次筛选)
- 大区间素数筛选(POJ 2689)
- 大区间素数筛选(POJ 2689)
- POJ 2689 Prime Distance 素数筛选 -
- POJ 2739 素数筛选
- poj 1411 素数筛选
- poj 3518(筛选素数)
- POJ-3126-宽搜+素数筛选
- POJ 2739 素数筛选法打表
- poj -- 2689 Prime Distance(筛选法求素数)
- poj 2689(区间筛选素数。。。很经典)
- Tomcat启动时报异常:端口占用的解决办法
- 【HDU1069】【Monkey and Banana】
- hdu 2149 Public Sale(巴什博奕)
- Nginx的启动、停止、平滑启动、平滑升级
- uva 10269 Adventure of Super Mario (floyd + dijkstra)
- poj-2689素数筛选
- 获取Android设备唯一标识码
- PathPicker
- Android 谷歌 开源 通信框架 VOLLEY(三)——图片加载处理
- cocos2d-js打包至android时可能遇到的问题
- 利用 ssh 的用户配置文件 config 管理 ssh 会话
- jquery使用uploadify插件实现多文件的上传(java版)
- Android开发监听指定号码发来的短信
- POJ 2245 Lotto(组合数dfs)