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 ...
随机推荐
- SQL基础--查询之五--查询语句一般格式
SQL基础--查询之五--查询语句一般格式
- mysql 约束条件 not null与default
not null与default 是否可空,null表示空,非字符串not null - 不可空null - 可空 use db4: 默认值,创建列时可以指定默认值,当插入数据时如果未主动设置,则自动 ...
- linux 如何查看防火墙是否开启
service iptables status可以查看到iptables服务的当前状态.但是即使服务运行了,防火墙也不一定起作用,你还得看防火墙规则的设置 iptables -L在此说一下关于启动和关 ...
- [JS]1.Hello Word
1.Hello Word <!DOCTYPE html> <html> <head> <title>Hello World!</title> ...
- 1、安装electron
安装electron安装并非一帆风顺,我有FQ哈,所以网络方面我就不说了,你们不行的话,可以用cnpm,我说的是另一个问题 我是这样解决的,用以下命令就好了 sudo npm install -g e ...
- node学习笔记第一天
ES6---* JavaScript语言随着使用的人越来越多,ECMA语法规范:if/else* 为了让js语言更适应大型应用的开发.旨在消除一些怪异的行为 ### 包含内容(strict严格模式)- ...
- Qt多线程同步总结
1.QMutex QMutex mutex; void func() { mutex.lock(); ........ mutex.unlock(); } 2.QMutex联手QMutex ...
- NOSQL数据库-Redis
官方提倡使用Linux版的Redis,所以官网值提供了Linux版的Redis下载,我们可以从GitHub上下载window版的Redis,具体链接地址如下: · 官网下载地址:http://redi ...
- AI学习资料
OpenAI Gym介绍 http://m.blog.csdn.net/u010510350/article/details/71450232
- Windows10下用Anaconda3安装TensorFlow教程【转】
本文转载自:https://www.cnblogs.com/HongjianChen/p/8385547.html 1. 安装好Anaconda3版本 (1) 注:可以发现最新版本是Anaconda5 ...