POJ 2689 筛法求素数
DES:给出一个区间[L, U]。找出这个区间内相邻的距离最近的两个素数和距离最远的两个素数。其中1<=L<U<=2147483647 区间长度不超过1000000.
思路:因为给出的U的范围超出了int的最大。所以不能直接打出1-U的素数表。【我们知道。利用素数筛法时是把所有的合数都筛掉了。那么我们也想办法把L-U内的合数都筛掉就可以了。那么只要用sqrt(U)内的素数去筛掉L-U的合数就可以了。】只是大概理解。。。。。。。
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <iostream>
using namespace std; #define N 500000
#define len 10000000
#define inf 0x7fffffff
bool isprime[N+];
long long prime[N], cnt;
bool res[len+]; void init() { // 筛选50000内的素数。要注意i比较大时 会容易超int的范围
long long i, j;
cnt = ;
memset(isprime, true, sizeof(isprime));
for (i=; i<=N; ++i) {
if (isprime[i]) {
prime[cnt++] = i;
if (i*i <= N) {
for (j=i*i; j<=N; j+=i) {
isprime[j] = false;
}
}
}
}
} int main() {
long long L, U, i, j, k, minn, maxx, s, t;
init();
while(~scanf("%lld%lld", &L, &U)) {
memset(res, , sizeof(res));
for (i=; i<cnt; ++i) {
s = (L-)/prime[i]+; // s和t表示了当前范围里的数对这个素数的最小倍数和最大倍数。 比如说 区间[3, 9] 对素数2 的 s 和 t 应是 2, 4
t = U/prime[i]; // 由这个例子可以知道为什么 L-1 最后再+1。t就可以直接除。
for (j=s; j<=t; ++j) { // 筛选出区间内的素数
if (j>) { // 不知道为什么==1的时候也不算?????
res[j*prime[i]-L] = true;
}
}
}
k = -, minn = inf, maxx = -;
long long dis, m1, m2;
for (i=; i<=U-L; ++i) { // 求解最优值
if (!res[i]) {
if (k!=-) {
dis=i-k; // 记录两个素数的最远距离。
if (dis > maxx) {
maxx = dis;
m1 = i;
}
if (dis < minn) {
minn = dis;
m2 = i;
}
}
if (i+L != ) // 注意1 的时候特殊判断1不是素数。
k=i;
}
}
if (maxx == -)
printf("There are no adjacent primes.\n");
else printf("%lld,%lld are closest, %lld,%lld are most distant.\n", m2-minn+L, m2+L, m1-maxx+L, m1+L);
}
return ;
}
代码可以理解。裸敲好像。。。还是有一点难度。明天再敲一遍。
POJ 2689 筛法求素数的更多相关文章
- poj 2262 筛法求素数(巧妙利用数组下标!)
Goldbach's Conjecture Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 41582 Accepted: ...
- 蓝桥杯 算法训练 Torry的困惑(基本型)(水题,筛法求素数)
算法训练 Torry的困惑(基本型) 时间限制:1.0s 内存限制:512.0MB 问题描述 Torry从小喜爱数学.一天,老师告诉他,像2.3.5.7……这样的数叫做质数.Torry突 ...
- hdu 4548 筛法求素数 打表
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4548 Problem Description 小明对数的研究比较热爱,一谈到数,脑子里就涌现出好多数的问题 ...
- UVA 10006 - Carmichael Numbers 数论(快速幂取模 + 筛法求素数)
Carmichael Numbers An important topic nowadays in computer science is cryptography. Some people e ...
- 筛法求素数Java
输出:一个集合S,表示1~n以内所有的素数 import java.util.Scanner; public class 筛法求素数 { public static void main(String[ ...
- Algorithm --> 筛法求素数
一般的线性筛法 genPrime和genPrime2是筛法求素数的两种实现,一个思路,表示方法不同而已. #include<iostream> #include<math.h> ...
- JD 题目1040:Prime Number (筛法求素数)
OJ题目:click here~~ 题目分析:输出第k个素数 贴这么简单的题目,目的不清纯 用筛法求素数的基本思想是:把从1開始的.某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉.剩下 ...
- 2018牛客网暑期ACM多校训练营(第三场) H - Diff-prime Pairs - [欧拉筛法求素数]
题目链接:https://www.nowcoder.com/acm/contest/141/H 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...
- 埃氏筛法求素数&构造素数表求素数
埃氏筛法求素数和构造素数表求素数是一个道理. 首先,列出从2开始的所有自然数,构造一个序列: 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1 ...
随机推荐
- MAC OSX
你可以输入下面的命令来查看IPv4端口:(最好加 sudo) # lsof -Pnl +M -i4
- 验证ip地址
package site.wangxin520.test; import sun.net.util.IPAddressUtil; public class Test { public static v ...
- Ubuntu18.04 英文系统下安装中文输入法
今天尝试了Ubuntu18.04LTS(依旧装的英文版)发现按照之前的方法( http://www.cnblogs.com/asmer-stone/p/5227188.html)安装中文输入法不行了, ...
- (2.13)Mysql之SQL基础——触发器
(2.13)Mysql之SQL基础——触发器 关键词:Mysql触发器 1.一般形式 -- 0.查看触发器[1]SHOW TRIGGERS;[2]SELECT * FROM `information_ ...
- hashset和treeset的区别
hashset 和 treeset的区别 hashset 和 treeset的区别 1.TreeSet 是二差树实现的,Treeset中的数据是自动排好序的,不允许放入null值. 2.HashSet ...
- vs2010中如何编写C语言程序
File->New->Project 在打开的New Project对话框中最左侧一栏中选择Visual C++下面的CLR,之后在其右侧的区域中选择CLR Empty Applicati ...
- 使用RequireJS并实现一个自己的模块加载器 (二)
2017 新年好 ! 新年第一天对我来说真是悲伤 ,早上兴冲冲地爬起来背着书包跑去实验室,结果今天大家都休息 .回宿舍的时候发现书包湿了,原来盒子装的牛奶盖子松了,泼了一书包,电脑风扇口和USB口都进 ...
- cocos2dx 3.x 区域画图
.h文件 bool onTouchBegan(cocos2d::Touch *pTouch, cocos2d::Event *pEvent); void onTouchMoved(cocos2d::T ...
- 怎么测试一个web登录页面
在以前的面试和同事面试交流的过程中,有多次被问到:“给你一个登录页面,上面有2个textbox,一个提交按钮,你将怎么测试”?或问,请针对这个页面设计30个以上的test case. 此题的考察目的: ...
- 获取当前线程id
转:https://www.cnblogs.com/comsky/p/6020327.html 如果获得当前进程的Id用: Process[] processes = Process.GetProce ...